如何使用 Mimekit 检查 MIME 消息是否加密或签名?

How to check if a MIME message is encrypted or signed using Mimekit?

我只想检查 MIME 消息是否使用 Mimekit 加密或签名。

我不想解密或验证它的签名,我只想知道它是否加密或签名。

我希望找到它作为函数:MimeMessage 中的 IsSigned() 和 IsEncrypted() Class 但这些函数不存在!

谢谢。

这些方法不存在,因为 MimeMessage 本身无法签名或加密,只有消息的 Body(或正文的子集)可以签名或加密。

一个非常简单的解决方案是:

var pkcs7 = message.Body as ApplicationPkcs7Mime;

bool signed = (message.Body is MultipartSigned) ||
    (pkcs7 != null && pkcs7.SecureMimeType == SecureMimeType.SignedData);

bool encrypted = (message.Body is MultipartEncrypted) ||
    (pkcs7 != null && pkcs7.SecureMimeType == SecureMimeType.EnvelopedData);

注意:MultipartEncrypted只与PGP一起使用(不是S/MIME),所以如果你只关心S/MIME,你不需要检查MultipartEncrypted .

同样,ApplicationPkcs7Mime只用于S/MIME,所以如果你只关心PGP,你不需要检查ApplicationPkcs7Mime

不过,PGP 和 S/MIME(可以)使用 MultipartSigned,所以无论哪种情况,您都必须检查一下。

因为我曾经使用过的每个客户或从只有 ever sign and/or 收到的邮件都会加密邮件的 top-level Body 部分,所以上面的检查可能都是你的'会需要的但是,可能 MIME-compliant 客户端签署 and/or 加密 Body 的子部分,因此您必须遍历 MIME 树并检查每个节点是否要 100% 合规。