Конвертировать хеш MD5 / SHA1 из двоичного в шестнадцатеричный дайджест - PullRequest
4 голосов
/ 03 августа 2011

Я ищу способ преобразования хэшей MD5 и SHA1 из их двоичных представлений в шестнадцатеричные и наоборот. Я хочу сделать это на Perl, но приветствуются и общие объяснения.

use Digest::MD5 qw(md5 md5_hex md5_base64);
$data = "Plaintext";
$digest_bin = md5($data);
$digest_hex = md5_hex($data);

Как я могу сравнить $digest_bin и $digest_hex и убедиться, что они являются хешами одного и того же $data?

Ответы [ 3 ]

10 голосов
/ 03 августа 2011
unpack("H*", md5($x)) eq md5_hex($x); 
pack("H*", md5_hex($x)) eq md5($x);

perldoc -f pack

Аргумент "H *" используется для перевода строки байтов в их шестнадцатеричное представление и наоборот.

5 голосов
/ 03 августа 2011

Если вы посмотрите на источник Digest :: MD5 :: Perl, который является чистой версией Digest :: MD5 для perl, вы увидите:

sub _encode_hex { unpack 'H*', $_[0] }    
sub md5_hex { _encode_hex &md5 }

Итак, вы можете сделать:

if ($digest_hex eq unpack 'H*', $digest_bin) {
    # same data
}
0 голосов
/ 03 августа 2011
say "digest_hex: $digest_hex;
say "digest_bin (as hex): ", unpack("H*", $digest_bin);
...