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 であると予想されます。)


16 進形式のダイジェストの操作について:

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

ハッシュを視覚的に比較します。おそらく、それらはフレーミングが異なり、簡単に見えて修正可能です。コードが完全に異なる場合は、入力データの「salt」および/またはバイナリ形式を確認してください。

于 2012-05-29T16:22:19.240 に答える