我有点困惑。我想得到一个String的字节,用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上是相同的,但第二个是不同的。为什么以及如何使用Úcûi®°<wkÒ>‘âÁË=ó5Ó
这样的校验和?
答案 0 :(得分:2)
在您的 JavaScript 中,您在 String 上执行 SHA-1 ,这是来自字节 Array <的数字/ em>(因此与 String content
不同。)
console.warn(CryptoJS.SHA1(content.getBytes().toString()).toString().getBytes());
// ^^
在 Java 中,您正在byte[]
上执行 SHA-1 (相当于 String content
)
byte[] sha1 = MessageDigest.getInstance("SHA1").digest(message.getBytes());
// ^^
您的toString
正在为 Java 中 SHA-1 的内容创建一个非常不同的数据。
另外(不确定是否相关):在内部, JavaScript 使用 UTF-16 作为字符串。
此外, JavaScript 的记录输出不能是 SHA-1 ,因为它的长度不正确;这是因为.toString().getBytes()
在计算后sha1
重复了{{1}},Stephen C在this comment中提到了这一点。
答案 1 :(得分:1)
以下是解决方案:
使用Javascript:
key = 'testKey';
var hashedKey = CryptoJS.SHA1(key);
console.log(hashedKey);
输出:2420e186fcdb8d0ea08d82fdfbfb8722d6cbf606
爪哇:
password="testKey";
final MessageDigest md = MessageDigest.getInstance("SHA1");
ByteArrayOutputStream pwsalt = new ByteArrayOutputStream();
pwsalt.write(password.getBytes("UTF-8"));
byte[] unhashedBytes = pwsalt.toByteArray();
byte[] digestVonPassword = md.digest(unhashedBytes);
System.out.println(bytesToHex(digestVonPassword));
输出:2420E186FCDB8D0EA08D82FDFBFB8722D6CBF606
除了大写与小写之外,输出是相同的。顺便说一下,它是十六进制的。
答案 2 :(得分:-1)
我找到了这个库。它产生与Java相同的值