将MD5/SHA1哈希从二进制转换为十六进制摘要

sw0*_*x2A 4 perl hash md5

我正在寻找一种方法将MD5和SHA1哈希从二进制转换为十六进制表示,反之亦然.我想在Perl中做到这一点,但也欢迎一个共同的解释.

use Digest::MD5 qw(md5 md5_hex md5_base64);
$data = "Plaintext";
$digest_bin = md5($data);
$digest_hex = md5_hex($data);
Run Code Online (Sandbox Code Playgroud)

我如何比较$digest_bin$digest_hex确保它们是相同的哈希值$data

Dal*_*aen 10

unpack("H*", md5($x)) eq md5_hex($x); 
pack("H*", md5_hex($x)) eq md5($x);
Run Code Online (Sandbox Code Playgroud)

perldoc -f pack

"H*"参数用于将字符串转换为十六进制表示,反之亦然.


Eug*_*ash 5

如果你看一下Digest :: MD5 :: Perl的源代码,它是Digest :: MD5的纯perl版本,你会看到:

sub _encode_hex { unpack 'H*', $_[0] }    
sub md5_hex { _encode_hex &md5 }
Run Code Online (Sandbox Code Playgroud)

所以你可以这样做:

if ($digest_hex eq unpack 'H*', $digest_bin) {
    # same data
}
Run Code Online (Sandbox Code Playgroud)