验证文档上的签名
[CAPICOM 是一个仅限 32 位的组件,可用于以下操作系统:Windows Server 2008、Windows Vista 和 Windows XP。 请改用.NET Framework来实现安全功能。 有关详细信息,请参阅 使用 CAPICOM 的替代方法。]
收到签名文档时,可以检查签名的有效性。 可以检查签名的以下情况:
- 签名哈希的有效性
- 签名者证书的有效性
签名哈希是使用签名者证书上发现的签名者的公钥解密的,该公钥包含在签名中。 如果解密的签名与原始文档的新哈希匹配,则签名是由与用于解密哈希的公钥关联的私钥的所有者创建的。 此外,签名所基于的文档保证在创建签名后不会被更改。
还可以检查提供公钥和签名者标识的证书的有效性,包括证书是否已吊销、证书是否过期或证书是否由受信任的证书颁发者颁发的问题。
在以下示例中,已签名的内容和 SignedData 对象从文件中读取,并检查用于创建签名的证书的签名和有效性。
注意
如果签名在加密上无效或签名者的证书无效,则会引发异常,并且验证程序必须处理该异常。 发生任何 CAPICOM 错误时,将返回 Err.Number 的负十进制值。 有关详细信息,请参阅 CAPICOM_ERROR_CODE。 有关 Err.Number 的正十进制值的信息,请参阅 Winerror.h。
Sub VerifySig(ByVal FileToVerify As String, ByVal FileBase As String)
On Error GoTo ErrorHandler
Dim sdContent As String
Dim sdCheck As String
Dim mySD As SignedData
Set mySD = New SignedData
' Open a file and read the signature.
Open FileToVerify For Input As #1
Input #1, sdCheck
Close #1
' Open a file and input the plaintext content that was signed.
Open FileBase For Input As #2
Input #2, sdContent
Close #1
' Set the detached content upon which the signature is based.
mySD.Content = sdContent
' Verify the detached signature.
On Error Resume Next
mySD.Verify sdCheck, True
If Err.Number <> 0 Then
MsgBox "Signature verification failed. " & Err.Description
Else
MsgBox "Verification complete."
End If
' Release the SignedData object.
Set mySD = Nothing
Exit Sub
ErrorHandler:
If Err.Number > 0 Then
MsgBox "Visual Basic error found: " & Err.Description
Else
MsgBox "CAPICOM error found: " & Hex(Err.Number)
End If
End Sub