【发布时间】:2021-08-26 22:42:45
【问题描述】:
我正在尝试将最初用 Java 编写的哈希函数转换为我们代码库中的 Javascript。但是,我得到了不同的结果。 下面是Java中的代码
public static String hashText(String str) {
MessageDigest messageDigest;
try {
messageDigest = MessageDigest.getInstance("SHA-512");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
messageDigest = null;
}
byte[] bytes = str.getBytes();
for (int i = 0; i < 64; i++) {
messageDigest.update(bytes);
bytes = messageDigest.digest();
}
hashedText = new String(Base64.encode(bytes, 2));
return hashedText.replace(StringUtils.LF, "");
}
这是我用 Javascript 写的
function hashText(text){
const crypto = require('crypto')
const hash = crypto.createHash('sha512');
const digest = hash.update(text).digest();
return digest.toString("base64")
}
console.log(hashText(text))
我一直在试图找出我在这里做错了什么,但还没有成功。我需要帮助!
【问题讨论】:
-
java 中的
for循环,看起来它正在重新散列 64 次。看起来你只在 javascript 中散列一次。 -
您在 Java 中的
Base64.encode(byte[],int)与java.util或 Apache commons-codec 不匹配,所以如果它做任何奇怪的事情(我不会说非标准,因为没有明确的标准对于base64),如果没有帮助,base64的nodejs版本可能无法匹配。 -
你的系统上 Java 的“默认字符编码”是什么?一些 ISO-8859 变体?一些 Windows 代码页? UTF-8? 'str.getBytes()' 的结果取决于该默认值。第二点:这将有助于提供一些示例输入和预期/不同的输出。
-
@RalfKleberhoff 默认为 UTF-8。我已经能够解决它,并发布了答案以防其他人需要它。谢谢
标签: java node.js react-native encryption cryptojs