[英]SHA1 hash of Java doesn't match with that of Perl
如何獲得Java的MessageDigest.digest()結果與Perl的sha1-> digest匹配? 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;
我在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");
檢查Java中字符串的編碼,string.getBytes()將使用默認的平台編碼,該編碼可能與perl函數使用的編碼不同。 您必須確保兩個平台都使用相同的編碼。
視覺比較哈希值。 它們的框架可能不同,這很容易看到和固定。 如果代碼完全不同,則檢查輸入數據的“鹽”和/或二進制格式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.