【发布时间】: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。