我在Nodejs上有这个代码我需要编写类似于Java的代码,但结果不同。我认为问题在于十六进制编码。但我不明白它是如何运作的。
Nodejs代码:
crypto.createHash('sha256').update(seed, 'hex').digest()
Java代码:
digest = MessageDigest.getInstance("SHA-256");
byte[] encodedhash = digest.digest(seedString);
答案 0 :(得分:2)
这两个代码将为您提供相同的输出
的NodeJS
var data = "seed";
var crypto = require('crypto');
crypto.createHash('sha256').update(data).digest("hex");
爪哇
import java.security.MessageDigest;
public class SHAHashingExample
{
public static void main(String[] args)throws Exception
{
String password = "seed";
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(password.getBytes());
byte byteData[] = md.digest();
//convert the byte to hex format method 1
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}
System.out.println("Hex format : " + sb.toString());
//convert the byte to hex format method 2
StringBuffer hexString = new StringBuffer();
for (int i=0;i<byteData.length;i++) {
String hex=Integer.toHexString(0xff & byteData[i]);
if(hex.length()==1) hexString.append('0');
hexString.append(hex);
}
System.out.println("Hex format : " + hexString.toString());
}
}
更多详情:
正如其他人所指出的,这是一个如何呈现数据的问题。如果在update
函数中你没有指定任何内容 - 就像我上面给出的解决方案一样 - 你要告诉我们将seed
解释为使用默认的UTF-8编码进行编码。现在,以十六进制表示的UTF-8字符串seed
的翻译是什么?答案是73656564
,因为您可以轻松查看例如this online tool
现在让我们进行验证。让我们写一下:
的NodeJS
var data = "73656564";
crypto.createHash('sha256').update(data, 'hex').digest('hex');
您也会得到相同的结果。您告诉update
函数您提供的数据是hex
表示,必须解释为
希望这有助于澄清hex
答案 1 :(得分:0)
来自nodejs documentation:
使用给定数据更新哈希内容,其编码为 在inputEncoding中给出,可以是'utf8','ascii'或'latin1'。如果 没有提供编码,数据是一个字符串,一个编码 “utf8”被强制执行。如果数据是Buffer,TypedArray或DataView,那么 inputEncoding被忽略。
简单来说,它意味着您提供的数据格式。
PS。
代码在更新中看起来有点不对,你提供的数据不是种子。