如何让Java的MessageDigest.digest()结果与Perl的sha1->摘要相匹配? MessageDigest.digest()接受string.getBytes(),其中Perl我只是将一个字符串传递给sha1对象。这就是它失败的原因吗?
JAVA:
String mystring ="zWh9YZX3";
MessageDigest.getInstance("SHA-1").digest(mysrting.getBytes())
的Perl:
$mystring ="zWh9YZX3";
$sha1 = Digest::SHA1->new;
$sha1->add($mystring);
$digest = $sha1->digest;
答案 0 :(得分: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;
如果使用UTF-8编码源代码,请不要忘记使用use utf8;
。 (否则,它实际上有望为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");
答案 1 :(得分:1)
检查字符串的编码,在Java中,string.getBytes()将使用默认的平台编码,该编码可能与perl函数使用的编码不同。您必须确保对两个平台使用相同的编码。
答案 2 :(得分:0)
直观地比较哈希。可能他们的框架不同,框架很容易看到和固定。如果代码完全不同,则检查输入数据的“salt”和/或二进制格式。