2

私は少し混乱しています。SHA1 でハッシュされた文字列のバイトを取得したい。

JavaScript:

var content = "somestring";
console.warn(content.getBytes().toString());
console.warn(CryptoJS.SHA1(content.getBytes().toString()).toString().getBytes());

String.prototype.getBytes = function () {
var bytes = [];
for (var i = 0; i < this.length; i++){
    bytes.push(this.charCodeAt(i));
}
return bytes;
};

Array.prototype.toString = function(){
var result = "";
for(var i = 0; i < this.length; i++){
    result += this[i].toString();
}
return result;
}

それは私に与えます

115111109101115116114105110103
[52, 99, 97, 54, 48, 56, 99, 51, 53, 54, 102, 54, 48, 53, 50, 49, 99, 51, 49, 51, 49, 100, 49, 97, 54, 55, 57, 55, 56, 55, 98, 52, 52, 52, 99, 55, 57, 102, 54, 101]

ジャワ:

String message = "somestring";
byte[] sha1 = MessageDigest.getInstance("SHA1").digest(message.getBytes());
System.out.println(Arrays.toString(message.getBytes()));
System.out.println(Arrays.toString(sha1));
System.out.println(new String(sha1));

それは私に与えます

[115, 111, 109, 101, 115, 116, 114, 105, 110, 103]
[-38, 99, -5, 105, -82, -80, 60, 119, 107, -46, 62, -111, -30, -63, -53, 61, -13, 1, 53, -45]
Úcûi®°<wkÒ>‘âÁË=ó5Ó

最初の出力は JavaScript と Java で同じですが、2 番目の出力は異なります。なぜ、どのようにチェックサムがÚcûi®°<wkÒ>‘âÁË=ó5Ó可能なのですか?

4

3 に答える 3

2

JavaScriptでは、バイト配列からの数値であるStringに対してSHA-1を実行しています ( Stringとは異なります)。 content

console.warn(CryptoJS.SHA1(content.getBytes().toString()).toString().getBytes());
//                                              ^^

Javaでは、 ( Stringに相当する)でSHA-1を実行しています。byte[] content

byte[] sha1 = MessageDigest.getInstance("SHA1").digest(message.getBytes());
//                                                                ^^

JavaでSHA -1toStringを実行しているものとは非常に異なるデータを作成しています。

また (関連するかどうかは不明): 内部的に、JavaScriptStringsにUTF-16を使用します。


さらに、JavaScriptのログ出力は長さが間違っているため、 SHA-1にすることはできません。これは、計算後に.toString().getBytes()繰り返されるためです ( Stephen Cはこのコメントでこれについて言及しています)。sha1

于 2013-06-28T00:40:21.757 に答える