将哈希从Java转换为Javascript

将哈希从Java转换为Javascript,java,node.js,react-native,encryption,cryptojs,Java,Node.js,React Native,Encryption,Cryptojs,我正在尝试将最初用Java编写的哈希函数转换为代码库中的Javascript。然而,我得到了不同的结果。 下面是Java中的代码 public static String hashText(String str) { MessageDigest messageDigest; try { messageDigest = MessageDigest.getInstance("SHA-512"); } catch (NoSuchAlgorit

我正在尝试将最初用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中的循环,它看起来要将散列重新灰化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));
函数hashText(text,iter=1){ const crypto=require('crypto'); 让摘要=文本; for(设i=0;i *编辑:我不使用java,不知道如何工作。具体而言:

。。。进行此调用后,将重置摘要


在节点中,这意味着在循环的每个迭代中运行
createHash
。感谢@dave_thompson_085指出这一点

事实证明nodejs加密散列复制的工作方式有点不同。如中所述,它创建一个新的哈希对象,其中包含当前哈希对象内部状态的深度副本。然而,我需要的是用编码的字符串创建一个新的散列

下面是一个工作片段的示例

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));
函数hashText(文本,长度){
const crypto=require('crypto');
让摘要=文本;
for(设i=0;i

多亏了java中的
for
循环中的每个人,它看起来已经将散列重新灰化了64次。看起来您在javascript中只进行了一次哈希运算。您在Java中的
Base64.encode(byte[],int)
Java.util
one或Apache commons编解码器都不匹配,因此如果它做了一些奇怪的事情(我不说是非标准的,因为Base64没有明确的标准),如果没有帮助,base64的nodejs版本可能不匹配。在您的系统上,Java的“默认字符编码”是什么?一些ISO-8859变体?一些Windows代码页?UTF-8?“str.getBytes()”的结果取决于该默认值。第二点:这将有助于提供一些示例输入和预期/不同的输出。@RalfKleberhoff默认值为UTF-8。我已经解决了这个问题,并且已经发布了答案,以备其他人需要。谢谢你说的对nodejs散列不能像Java那样循环使用,但是在
update
之后执行
copy
会得到错误的结果。使循环体
digest=hash.copy().update(digest.digest()
--或
digest=crypto.createHash('sha512').update(digest).digest()没有预先创建。@David784,我刚试过你的答案,它不正确。我仍然得到不同的结果谢谢@dave_thompson_085,根据你的更正编辑了我的答案。
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));