0

我正在开发一个更大的应用程序,它通过 POP3、IMAP 或通过从 .msg 文件导入(从 Outlook 导出或从 Outlook 拖过来)接收电子邮件。

最近我收到一封带有附件“smime.p7m”的电子邮件。经过进一步检查,它原来是一个 MIME 消息

内容类型:多部分/签名;协议="应用程序/x-pkcs7-签名";

在其他部分中,它包含一个部分

内容类型:application/x-pkcs7-signature;name="smime.p7s" 内容传输编码:base64 内容处置:附件;文件名="smime.p7s"

我尝试使用OpenPopMIME 消息解析器验证此签名并SignedCms检查签名。我的尝试如下所示:

var datapart = OpenPop.MessagePart[...];
var part3 = OpenPop.MessagePart[3]; // the signature

var ci = new ContentInfo(datapart);            
var sCMS = new SignedCms(ci, detached: true);
sCMS.Decode(part3.Body);
sCMS.CheckHash();

sCMS.CheckSignature(verifySignatureOnly:true);

但无论我用什么,datapart我总是得到

System.Security.Cryptography.CryptographicException 哈希值不正确。

如何验证签名?

有更好的方法吗?

4

1 回答 1

1

最简单的方法是使用MimeKit(它不仅是开源的,而且可以免费用于商业用途)。

由于您所关心的只是验证签名,因此您可以只使用 aMimeKit.Cryptography.TemporarySecureMimeContext而不是设置自己的(就像 README 和其他文档讨论的那样)。

通常,当您收到通过 S/MIME 签名的消息时,它几乎总是根级别的 MIME 部分multipart/signed,这使得这更容易(验证签名的第一步是找到该multipart/signed部分)。

var signed = message.Body as MultipartSigned;
if (signed != null) {
    using (var ctx = new TemporaryMimeContext ()) {
        foreach (var signature in signed.Verify (ctx)) {
            try {
                bool valid = signature.Verify ();

                // If valid is true, then it signifies that the signed
                // content has not been modified since this particular
                // signer signed the content.
                //
                // However, if it is false, then it indicates that the
                // signed content has
                // been modified.
            } catch (DigitalSignatureVerifyException) {
                // There was an error verifying the signature.
            }
        }
    }
}

您可以在www.mimekit.net/docs找到 MimeKit 的 API 文档。

于 2015-07-03T11:09:51.383 回答