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

Sap*_*ire 1 java perl sha1

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

JAVA:

String mystring ="zWh9YZX3";
MessageDigest.getInstance("SHA-1").digest(mysrting.getBytes())
Run Code Online (Sandbox Code Playgroud)

Perl的:

$mystring ="zWh9YZX3";  
$sha1 = Digest::SHA1->new;
$sha1->add($mystring);
$digest = $sha1->digest;
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 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
Run Code Online (Sandbox Code Playgroud)

x.pl:

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,您没有哈希相同的东西.在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;
Run Code Online (Sandbox Code Playgroud)

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");
Run Code Online (Sandbox Code Playgroud)