检查Outlook邮件(* .message)是否经过数字签名或加密

时间:2012-04-13 07:13:55

标签: c# .net encryption digital-signature

我有一个Web应用程序,允许使用文件上载上传Outlook Mails(* .msg)。 客户希望禁止使用Digitaly Signed或Encrypted的商店邮件。 因此,在上传邮件后,如果邮件已签名或加密,我应该会检查邮件。

如果有办法检查那个?就像文件流中的模式一样?

3 个答案:

答案 0 :(得分:2)

检查英文单词不仅有效,而且是实际记录的方式。

请参阅权威:

2.1.3.1.3 Recognizing a Message Object that Represents a Clear-Signed Message

  

如果Message对象具有消息类(PidTagMessageClass属性)   ([MS-OXCMSG]第2.2.1.3节))的值   “IPM.Note.SMIME.MultipartSigned”并且只包含一个附件   对象,它应该被视为一个明确签名的消息。额外   可以执行验证步骤以验证附件   对象标有适当的媒体类型(例如,   PidTagAttachMimeTag属性([MS-OXPROPS]部分2.680)有一个值   “multipart / signed”)表示有效的multipart / signed MIME   [RFC1847]中指定的实体。如果消息类值不是   “IPM.Note.SMIME.MultipartSigned”但它以后缀结尾   “.SMIME.MultipartSigned”,Message对象可以< 7>< 8>被视为一个   明确的信息。

     

如果Message对象的消息类值为   “IPM.Note.SMIME.MultipartSigned”没有指定结构   在第2.1.3.1节中,行为未定义。

2.1.3.2.3 Recognizing a Message Object that Represents an Opaque-Signed or Encrypted S/MIME

  

如果Message对象具有消息类(PidTagMessageClass属性)   ([MS-OXCMSG]第2.2.1.3节))“IPM.Note.SMIME”的值并包含   恰好是一个Attachment对象,它应该被视为一个   不透明签名的消息或加密的消息。额外验证   可以执行步骤以验证是否标记了Attachment对象   使用适当的媒体类型(例如,PidTagAttachMimeTag   财产([MS-OXPROPS]第2.680条)是其中之一   “application / pkcs7-mime”或“application / x-pkcs7-mime”,或者是   “application / octet-stream”和文件名,由。指定   PidTagAttachFilename属性([MS-OXPROPS]部分2.671),并且有一个   文件扩展名“.p7m”)并表示有效的加密或   opaque-signed消息,如[RFC3852]中所述。如果是的价值   message class不是“IPM.Note.SMIME”,而是以后缀结尾   “.SMIME”,然后Message对象可以< 11>被视为一个   不透明签名的邮件或加密的邮件。

     

邮件类值“IPM.Note.SMIME”可能不明确。< 12>

     

如果Message对象的消息类值为“IPM.Note.SMIME”   没有章节中规定的适当结构或内容   2.1.3.2,然后行为未定义。

修改

更具体地说,是的,你应该在文件流中寻找“模式”。

具体来说,如果MSG是unicode,您将扫描“__substg1.0_001A001F”流,并检查上述模式。

MSG文件是包含流和存储的OLE结构化存储文件。要获得流,如果您在C#世界中,请使用像OpenMCDF这样的OLE存储库。 java,python等也有类似的东西。

答案 1 :(得分:1)

This blog post很好地描述了格式,同一作者的another post准确描述了您所追求的内容,即有关权限管理邮件的信息。

基本上只要消息符合the file format,这些帖子和规范就会为您提供检查签名和加密所需的全部内容。

检查英语单词是个坏主意。如果用户不用英语写,如果伪随机的加密数据流恰好在他们正在使用的某些编码中创建“或”或“和”之类的内容会怎么样?这不可靠。

修改

当我说检查英语单词是一个坏主意时,澄清我的意思,我的意思是说只是扫描文件并验证是否存在某组单词是个坏主意。由于有人拒绝投票给这个解决方案,我觉得他们可能因为这种模棱两可而误解了我说的话。

正如另一位用户在答案中指出的那样,将对象解析出来并实际处理数据中的条件是可以的。您可以从他们的帖子中看到它是文档化的方法并且工作正常,因为它基于标准。这类似于我在这里给出的两个帖子和格式规范的信息。

答案 2 :(得分:0)

要打开邮件并查看,我建议您使用Outlook Redemption。这是我使用的,它没有安装在服务器上的Outlook。 如果GetMessageFromMsgFile方法返回RDOEncryptedMessage,则表示您的邮件已加密或签名。