我有一个允许通过文件上传上传 Outlook 邮件 (*.msg) 的 Web 应用程序。客户希望禁止存储数字签名或加密的邮件。因此,在上传邮件后,我应该检查邮件是否已签名或加密。
如果有办法检查吗?就像文件流中的模式?
我有一个允许通过文件上传上传 Outlook 邮件 (*.msg) 的 Web 应用程序。客户希望禁止存储数字签名或加密的邮件。因此,在上传邮件后,我应该检查邮件是否已签名或加密。
如果有办法检查吗?就像文件流中的模式?
检查英文单词不仅是有效的,而且是实际记录的方式。
参考权威:
如果消息对象的消息类(PidTagMessageClass 属性([MS-OXCMSG] 第 2.2.1.3 节))值为“IPM.Note.SMIME.MultipartSigned”并且只包含一个附件对象,则应将其视为明文签名信息。可以执行其他验证步骤来验证 Attachment 对象是否标记有适当的媒体类型(例如,PidTagAttachMimeTag 属性([MS-OXPROPS] 第 2.680 节)的值为“multipart/signed”)并表示有效的多部分/signed MIME 实体,如 [RFC1847] 中指定的那样。如果消息类值不是“IPM.Note.SMIME.MultipartSigned”但它以后缀“.SMIME.MultipartSigned”结尾,则消息对象可以<7><8>被视为明文签名消息。
如果消息类值为“IPM.Note.SMIME.MultipartSigned”的消息对象不具有第 2.1.3.1 节中指定的结构,则行为未定义。
2.1.3.2.3 识别表示不透明签名或加密 S/MIME 的消息对象
如果消息对象具有“IPM.Note.SMIME”的消息类(PidTagMessageClass 属性([MS-OXCMSG] 部分 2.2.1.3))值,并且只包含一个附件对象,则应将其视为不透明签名消息或加密的消息。可以执行其他验证步骤来验证附件对象是否标记有适当的媒体类型(例如,PidTagAttachMimeTag 属性([MS-OXPROPS] 第 2.680 节)是“application/pkcs7-mime”或“application/x- pkcs7-mime”,或者它是“application/octet-stream”和文件名,由 PidTagAttachFilename 属性([MS-OXPROPS] 第 2.671 节)指定,文件扩展名为“.p7m”),表示有效的加密或不透明签名的消息,如 [RFC3852] 中所述。
消息类别值“IPM.Note.SMIME”可能不明确。<12>
如果消息对象的消息类值为“IPM.Note.SMIME”,但不具有第 2.1.3.2 节中指定的适当结构或内容,则行为未定义。
编辑:
更具体地说,是的,您应该寻找“文件流中的模式”。
具体来说,如果 MSG 是 unicode,您将扫描“__substg1.0_001A001F”流,并检查上述模式。
MSG 文件是包含流和存储的 OLE 结构化存储文件。如果您在 C# 世界中,请使用 OLE 存储库,如OpenMCDF 。java、python等也有类似的。
这篇博客文章很好地描述了格式,同一作者的另一篇文章准确地描述了您所追求的内容,即有关权限管理邮件的信息。
基本上只要消息符合文件格式,这些帖子和规范就应该为您提供检查签名和加密所需的一切。
检查英语单词是个坏主意。如果用户不使用英语写作,如果加密数据的伪随机流碰巧在他们使用的某种编码中创建了诸如“或”或“和”之类的词怎么办?这只是不可靠。
编辑:
当我说检查英语单词是一个坏主意时,为了澄清我的意思,我的意思是说简单地扫描文件并验证是否存在一组特定的单词是个坏主意。由于有人对这个解决方案投了反对票,我觉得他们可能因为这种模棱两可而误解了我所说的。
正如另一位用户在他们的回答中指出的那样,将对象解析出来并实际处理数据中的条件是可以的。您可以从他们的帖子中看到它是记录在案的方法并且工作正常,因为它基于标准。这与我在这两个帖子和格式规范中提供的信息相似。
要打开邮件并查看,我建议您使用Outlook Redemption。这是我使用的,它可以在服务器上没有安装 Outlook 的情况下工作。如果 GetMessageFromMsgFile 方法返回 RDOEncryptedMessage,则表示您的邮件已加密或签名。