将散列从 Java 转换为 Java 脚本
Converting a hash from Java to Javascript
我正在尝试将最初用 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, "");
}
这是我在Java脚本
中写的
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 中散列一次。这是一个示例,说明如何在 node.js.
中执行该循环
function hashText(text, iter = 1) {
const crypto = require('crypto');
let digest = text;
for (let i = 0; i < iter; i++) {
const hash = crypto.createHash('sha512');
digest = hash.update(digest).digest();
}
return digest.toString('base64');
}
const text = 'asdf 1234 zxcv 5678';
console.log(hashText(text, 64));
*编辑:我不使用 java,不知道 MessageDigest.digest() 是如何工作的。具体来说:
... The digest is reset after this call is made.
在节点中,这意味着 运行 createHash
循环的每次迭代。感谢@dave_thompson_085 指出这一点!
事实证明,nodejs 加密哈希复制的工作方式有点不同。如 docs 中所述,它创建一个新的 Hash 对象,其中包含当前 Hash 对象的内部状态的深层副本。但是,我需要的是用编码后的字符串创建一个新的散列。
下面是工作片段的示例
function hashText(text, length) {
const crypto = require('crypto');
let digest = text;
for (let i = 0; i < length; i++) {
const hash = crypto.createHash('sha512');
hash.update(digest);
digest = hash.digest();
}
return digest.toString('base64');
}
console.log(hashText(text, 64));
感谢所有以某种方式提供帮助的人
我正在尝试将最初用 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, "");
}
这是我在Java脚本
中写的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 中散列一次。这是一个示例,说明如何在 node.js.
中执行该循环function hashText(text, iter = 1) {
const crypto = require('crypto');
let digest = text;
for (let i = 0; i < iter; i++) {
const hash = crypto.createHash('sha512');
digest = hash.update(digest).digest();
}
return digest.toString('base64');
}
const text = 'asdf 1234 zxcv 5678';
console.log(hashText(text, 64));
*编辑:我不使用 java,不知道 MessageDigest.digest() 是如何工作的。具体来说:
... The digest is reset after this call is made.
在节点中,这意味着 运行 createHash
循环的每次迭代。感谢@dave_thompson_085 指出这一点!
事实证明,nodejs 加密哈希复制的工作方式有点不同。如 docs 中所述,它创建一个新的 Hash 对象,其中包含当前 Hash 对象的内部状态的深层副本。但是,我需要的是用编码后的字符串创建一个新的散列。
下面是工作片段的示例
function hashText(text, length) {
const crypto = require('crypto');
let digest = text;
for (let i = 0; i < length; i++) {
const hash = crypto.createHash('sha512');
hash.update(digest);
digest = hash.digest();
}
return digest.toString('base64');
}
console.log(hashText(text, 64));
感谢所有以某种方式提供帮助的人