1

如何让 Java 的 MessageDigest.digest() 结果与 Perl 的 sha1->digest 匹配?MessageDigest.digest() 采用 string.getBytes() 在 Perl 中我只是将一个字符串传递给 sha1 对象。这就是它失败的原因吗?

爪哇:

String mystring ="zWh9YZX3";
MessageDigest.getInstance("SHA-1").digest(mysrting.getBytes())

珀尔:

$mystring ="zWh9YZX3";  
$sha1 = Digest::SHA1->new;
$sha1->add($mystring);
$digest = $sha1->digest;
4

3 回答 3

6

我在 Perl 和 Java 上得到了同样的结果。

$ perl x.pl | od -t x1
0000000 f7 d4 ae 4d bd df 5a d3 61 65 bb f8 be 60 45 03
0000020 e4 82 9d b6
0000024

$ javac x.java && java x | od -t x1
0000000 f7 d4 ae 4d bd df 5a d3 61 65 bb f8 be 60 45 03
0000020 e4 82 9d b6
0000024

x.pl

use Digest::SHA1;
my $bytes ="zWh9YZX3";  
my $sha1 = Digest::SHA1->new;
$sha1->add($bytes);
print $sha1->digest;

x.java

import java.security.MessageDigest;

class x {
    public static void main(String[] args) throws Exception {
        MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
        String mystring ="zWh9YZX3";
        byte[] bytes = mystring.getBytes();
        byte[] hash = sha1.digest(bytes);
        System.out.write(hash, 0, hash.length);
    }
}

请注意,您不是在散列相同的东西。在 Perl 代码中,您正在对字节进行哈希处理zWh9YZX3。在 Java 代码中,您正在散列环境特定的字符编码zWh9YZX3。如果碰巧有大于 127 的字节,结果会有所不同。

上面 Java 的 Perl 等价物是:

use Digest::SHA1;
use Encode;
my $mystring ="zWh9YZX3";  
my $bytes = encode('???', $mystring);
my $sha1 = Digest::SHA1->new;
$sha1->add($bytes);
print $sha1->digest;

use utf8;如果您的源代码使用 UTF-8 编码,请不要忘记使用。(否则,它实际上应该是 iso-8859-1。)


以十六进制形式处理摘要:

use strict;
use warnings;
use Digest::SHA1 qw( sha1_hex );

my $bytes = "zWh9YZX3";
my $digest_hex = sha1_hex($bytes);

print("INSERT INTO Foo VALUES (UNHEX('$digest_hex'))\n");
于 2012-05-29T16:39:28.870 回答
1

检查字符串的编码,在 Java 中 string.getBytes() 将使用默认的平台编码,这可能与 perl 函数使用的编码不同。您必须确保对两个平台使用相同的编码。

于 2012-05-29T16:27:25.693 回答
0

直观地比较哈希值。可能它们在框架上有所不同,这很容易看到和修复。如果代码完全不同,则检查输入数据的“盐”和/或二进制格式。

于 2012-05-29T16:22:19.240 回答