【发布时间】:2017-01-19 06:20:03
【问题描述】:
我只想检查 MIME 消息是否使用 Mimekit 加密或签名。
我不想解密它或验证它的签名,我只想知道它是加密的还是签名的。
我希望在 MimeMessage 类中找到以下函数:IsSigned() 和 IsEncrypted(),但这些函数不存在!
谢谢。
【问题讨论】:
我只想检查 MIME 消息是否使用 Mimekit 加密或签名。
我不想解密它或验证它的签名,我只想知道它是加密的还是签名的。
我希望在 MimeMessage 类中找到以下函数:IsSigned() 和 IsEncrypted(),但这些函数不存在!
谢谢。
【问题讨论】:
这些方法不存在,因为 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,因此无论哪种情况,您都必须检查一下。
由于我曾经使用或接收过的每个客户都只对邮件的顶级Body 部分进行签名和/或加密,因此您可能只需要上述检查。但是,兼容 MIME 的客户端可能签署和/或加密 Body 的子部分,因此您必须遍历 MIME 树并检查每个节点,如果您想100% 合规。
【讨论】: