簡體   English   中英

Java的SHA1哈希值與Perl的哈希值不匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM