验证文档上的签名

[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