将散列从 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));

感谢所有以某种方式提供帮助的人