如何在CGI中编码base64 md5?

时间:2013-06-05 23:33:13

标签: perl cgi base64 md5

我需要在CGI(Perl)中发布一些表单,其中一个输入需要在base64 md5中编码哈希值。应该获得的一方提供的样本,在PHP中工作如下:

$hash = base64_encode(md5( $data1."|". $data2."|". $data3));

要使它在CGI中工作,我使用以下代码:

use Digest::MD5 qw( md5_base64 );
my $base64_digest = md5_base64($data1."|". $data2."|". $data3);

但结果上的编码字符串是不同的,如果我在PHP中这样做。看起来我在CGI中做错了。如何正确编码?


$ echo '<? echo base64_encode(md5("abc|def|ghi")), "\n"; ?>' | php
MzJjNDcyZmE0MjI3MWYyYWE0YTg1MWZkMmM1NzRkODc=

$ perl -MDigest::MD5=md5_base64 -E'say md5_base64("abc|def|ghi");'
MsRy+kInHyqkqFH9LFdNhw

1 个答案:

答案 0 :(得分:2)

Perl                             PHP
-------------------------------  ------------------------------ 
md5($string)                     md5($string, 1)
md5_hex($string)                 md5($string, 0)
md5_base64($string)              base64_encode(md5($string, 1))
encode_base64(md5_hex($string))  base64_encode(md5($string, 0))   WASTEFUL

PHP的md5生成哈希的十六进制,类似于D :: MD5的md5_hex

$ echo '<? echo md5("abc|def|ghi"), "\n"; ?>' | php
32c472fa42271f2aa4a851fd2c574d87

$ perl -E'
    use Digest::MD5 qw( md5_hex );
    say md5_hex("abc|def|ghi");'
32c472fa42271f2aa4a851fd2c574d87

base64传递相同信息的字符更少。

$ echo '<? echo base64_encode(md5("abc|def|ghi", 1)), "\n"; ?>' | php
MsRy+kInHyqkqFH9LFdNhw==

$ perl -E'
   use Digest::MD5 qw( md5_base64 );
   say md5_base64("abc|def|ghi");'
MsRy+kInHyqkqFH9LFdNhw

$ perl -E'
   use Digest::MD5  qw( md5 );
   use MIME::Base64 qw( encode_base64 );
   say encode_base64(md5("abc|def|ghi"));'
MsRy+kInHyqkqFH9LFdNhw==

(删除尾随==不会更改值。)

您目前在PHP中所做的事情非常浪费。它比需要的时间长得多,并且需要额外的CPU时间来生成它。

$ echo '<? echo base64_encode(md5("abc|def|ghi")), "\n"; ?>' | php
MzJjNDcyZmE0MjI3MWYyYWE0YTg1MWZkMmM1NzRkODc=

$ perl -E'
   use Digest::MD5  qw( md5_hex );
   use MIME::Base64 qw( encode_base64 );
   say encode_base64(md5_hex("abc|def|ghi"), "");'
MzJjNDcyZmE0MjI3MWYyYWE0YTg1MWZkMmM1NzRkODc=