Perl MIME-Tools:正文部分的内容已更改

Posted

技术标签:

【中文标题】Perl MIME-Tools:正文部分的内容已更改【英文标题】:Perl MIME-Tools: Content changed of a body-part 【发布时间】:2018-07-25 20:41:02 【问题描述】:

我有以下示例输入到 mime-parser (mytest)。

Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha1; boundary="----=_Part_abc123"

------=_Part_abc123
Content-Type: application/text; name=test.txt
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=test.txt

VUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVU
VUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVU
------=_Part_abc123
Content-Type: application/pkcs7-signature; name=smime.p7s; smime-type=signed-data
Content-Transfer-Encoding: binary
Content-Disposition: attachment; filename="smime.p7s"
Content-Description: S/MIME Cryptographic Signature

blabla
------=_Part_abc123--

代码是这样的(读进去再写出来)。

use strict;
use warnings;
use MIME::Parser;

my $fn = "mytest";
my $parser = new MIME::Parser ();
$parser->output_to_core (1);

open (F, $fn);
my $entity = $parser->parse (\*F);
close (F);

open (F, ">mytestnew");
$entity->print (\*F);
close (F);

exit 1;

产生的输出(mytestnew)是这个。

Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha1; boundary="----=_Part_abc123"

------=_Part_abc123
Content-Type: application/text; name=test.txt
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=test.txt

VUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVU
VUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVU

------=_Part_abc123
Content-Type: application/pkcs7-signature; name=smime.p7s; smime-type=signed-data
Content-Transfer-Encoding: binary
Content-Disposition: attachment; filename="smime.p7s"
Content-Description: S/MIME Cryptographic Signature

blabla
------=_Part_abc123--

我们可以看到第一部分的内容发生了变化(见 VUVU... 换行符)。

如果使用签名(第二部分)来验证内容,那就有问题了。也许是因为 base64 编码并不“漂亮”。但是签名的验证并不关心这一点。它只是看到损坏的内容并失败。 在我的示例中,我剪掉了签名 - 问题不在于验证。

那么我怎样才能解析内容,用 MIME 工具再次写出并保持内容不变??

感谢您的帮助!

【问题讨论】:

base64 -d 在两个字符串上返回相同的输出。 如果您将输出解析到内存并写出解析的表示形式,您不能期望输出是相同的(除非您要解析的格式非常严格以至于表示形式没有变化是可能的)。我认为如果它在 MIME 表示而不是实际内容上运行,你的签名生成首先会被破坏,但我不熟悉 PKCS7。 【参考方案1】:

来自docs:

不要打算完全打印您解析的内容!

解析是一个(稍微)有损的操作。因为像这样的事情 base64编码中的歧义,下面就不吐槽了 它的输入在所有情况下都保持不变:

$entity = $parser->parse(\*STDIN);
$entity->print(\*STDOUT);

如果您使用 MIME::Tools 处理电子邮件,请记住保存 如果您想原封不动地发送,您解析的数据。这对于 诸如 PGP 签名的电子邮件之类的东西。

【讨论】:

以上是关于Perl MIME-Tools:正文部分的内容已更改的主要内容,如果未能解决你的问题,请参考以下文章

解码 UTF8 电子邮件标头

如何使用 java 从多部分数据中读取正文内容?

带有正文内容的 Python 电子邮件多部分

需要用 perl 解析 utf8 邮件

NSMutableURLRequest 发送部分帖子正文

Perl实例---批量替换内容