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:正文部分的内容已更改的主要内容,如果未能解决你的问题,请参考以下文章