我正在尝试在我的javascript代码中应用SHA1加密,就像java工作一样, 结果如下: java:
String str = "123456";
MessageDigest sha = MessageDigest.getInstance("SHA-1");
byte[] hash = sha.digest(str.getBytes());
for(int i =0 ; i<hash.length;i++){
System.out.print((new Byte(hash[i]))+" ");
}
java的输出:
124 74 -115 9 -54 55 98 -81 97 -27 -107 32 -108 61 -62 100 -108 -8 -108 27
javascript:
var key = "123456";
console.warn(CryptoJS.SHA1(key.getBytes().toString()).toString().getBytes());
javascript的outpur:
[54, 49, 52, 49, 51, 100, 55, 99, 53, 49, 50, 102, 100, 99, 98, 48, 98, 53, 53, 55, 57, 98, 55, 53, 56, 55, 50, 54, 53, 102, 55, 53, 99, 99, 98, 51, 53, 50, 52, 52]
如何使JavaScript完全按照Java的方式工作?所以它也必须产生一个数组。
String.prototype.getBytes = function () {
var bytes = [];
for (var i = 0; i < this.length; i++){
bytes.push(this.charCodeAt(i));
}
return bytes;
};
答案 0 :(得分:1)
我不知道key.getBytes()
应该是什么。您应该简单地将字符串传递给SHA1函数,并从中获取您选择的表示。这将从Java代码生成字节数组的匹配十六进制表示。
> var key = "123456";
> CryptoJS.SHA1(key).toString()
"7c4a8d09ca3762af61e59520943dc26494f8941b"
如果要创建完全相同的数组,可以迭代CryptoJS的本机表示形式的words
属性。每个整数用Big-Endian表示法表示4个字节。
var key = "123456";
var hash = CryptoJS.SHA1(key);
var byteArray = [];
hash.words.forEach(function(i){
var k;
for(var j = 3; j >= 0; j--){
k = (i >> (j*8)) & 0xFF;
k = k < 128 ? k : -(256 - k);
byteArray.push(k);
}
});