检查电子邮件的加密状态。

时间:2013-09-16 01:08:39

标签: python perl email encryption pgp

我最近一直在使用gpg-mailgate,并且几乎按照我想要的方式工作。

我的最后一个小障碍是如何可靠检查传入的电子邮件是否已经过pgp加密。以下是我看到的选项。

  1. 在postfix中添加使用Mail :: gpg.is_encrypted的内容过滤器,如果消息返回yes,则直接发送。如果没有,那么我可以将它发送到gpg-mailgate来处理它。

  2. 从gpg-mailgate中调用一个小的perl脚本,然后再次调用Mail :: GPG.is_encrypted并从那里开始。我在python中看到了一些调用perl的例子,我更喜欢这样做。

  3. 我可以不可靠通过查找 ** BEGIN PGP MESSAGE ** 来测试加密,但这绝不是一个好的解决方案

  4. 这就是我想出来的。由于gnupg python包装器中没有任何东西可以测试它,我想我将不得不考虑调用其他东西。

    我在前两个场景中担心的是性能。我试图尽可能地避免不必要的负担。

    我对所有建议持开放态度,谢谢。

1 个答案:

答案 0 :(得分:2)

通过电子邮件发送的GPG或其他OpenPGP邮件应以RFC 2015格式发送。这种检测非常简单,可靠,高效。

基本上,您只是检查RFC822标头是否有Content-Type,如下所示:

Content-Type: multipart/encrypted; boundary=whatever; protocol="application/pgp-encrypted"

执行此操作的理想方法是使用Python中的emailmime模块,或者perl中CPAN中您最喜欢的等价物,但是使用精心设计的正则表达式可以更快地完成。 (如果您选择这样做,请查找RFC822标头的预测试regexp并在此基础上进行构建,因为您在前20次操作时会得到RFC822的部分错误。续行,可选的空白遍布各处,组件的变量顺序,不区分大小写等。)


但是如果有人刚刚发送原始OpenPGP消息作为电子邮件的文本呢?至少一些MUA将检测到它并将其视为与正确的OpenPGP消息相同。他们是怎么做到的?基本上,你的建议方式是:通过扫描身体。

第一部分是获取身体本身。如果他们只是使用纯文本邮件程序,或者不是愚蠢的花哨邮件程序,那么它只是非多部分RFC 822邮件的主体,这很容易。但是如果你想处理喜欢HTML化所有东西的邮件程序,你需要找到文本/普通部分,然后才能扫描。可靠或快速地做到这一点并不是太糟糕,但两者都是?

现在,您如何判断邮件正文是否为OpenPGP? RFC 4880描述了格式。特别是,请参阅第6.2节关于ASCII装甲格式的内容。

但是简单地说:寻找一个盔甲标题行-----BEGIN PGP MESSAGE-----,然后是零个或多个RFC-822标题,然后是一个空行,然后是一个数据块,它是所有基数为64个字符和空格,然后是盔甲尾线-----END PGP MESSAGE-----。为了安全起见,您可能希望在标题和尾部之前和之后允许任意行(它不会使扫描更难)。任何与之匹配的内容都非常非常可能是OpenPGP消息;任何不适用的东西都不可能与GPG一起使用。


这仍然无法处理人们可能使用的每种可能情况。如果有人发送OpenPGP多部分消息分成两封电子邮件,拖放并删除OpenPGP消息,使其邮件将其转换为附件而不是正文,粘贴二进制OpenPGP消息而不是ASCII装甲消息, ......

但我怀疑只处理正确的OpenPGP MIME,并且纯文本体中的原始OpenPGP ASCII装甲应该足够了。