将哈希从Java转换为Javascript
我正在尝试将最初用Java编写的哈希函数转换为代码库中的Javascript。然而,我得到了不同的结果。 下面是Java中的代码将哈希从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
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在节点中,这意味着在循环的每个迭代中运行
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));