java - Java SHA1 与 JavaScript SHA1 的不同

标签 java javascript hash sha1

我有点困惑。我想获取一个字符串的字节,该字符串使用 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]

Java:

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Ó 的校验和可能吗?

最佳答案

在您的JavaScript中,您正在对字符串执行SHA-1,它是来自字节数组<的数字/em> (因此与您的 String content 不同)。

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

在您的Java中,您正在对byte[]执行SHA-1(这相当于您的字符串 内容)

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

您的 toString 正在创建与您在 Java 中 SHA-1 截然不同的数据。

另外(不确定是否相关):在内部,JavaScript 使用 UTF-16 作为字符串


此外,您的 JavaScript 的记录输出不能是 SHA-1,因为它的长度错误;这是由于 .toString().getBytes() 在计算后对 sha1 进行了重复( Stephen Cthis comment 中提到了这一点)。

关于java - Java SHA1 与 JavaScript SHA1 的不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17355421/

相关文章:

java - 使用另一个 Map 中的值按键对 Map 进行排序

java - 没有酒吧的舞台(javafx)

javascript - Fancytree:配置我自己的键盘导航

java - 将 Java 哈希码组合成 "master"哈希码

java - 重力方程-速度方程|为什么它只适用于某些 FPS?

java - Android 中的合理文本布局?

ruby - 冒号 ":"和粗箭头 "=>"有什么区别

hash - 是否存在可以保证哈希算法唯一的情况?

javascript - 在我的应用程序启动时创建所有路由是个好主意吗?

javascript - 十进制数的正则表达式,接受 0 到 4 位数字,但不接受字符