java - SHA-256 - NodeJS 和 Java 代码之间不匹配

标签 java node.js cryptography sha256

我在 Nodejs 上有这段代码,我需要像 Java 一样编写,但结果不同。我认为问题出在十六进制编码上。但我不明白它是如何工作的。

Nodejs 代码:

crypto.createHash('sha256').update(seed, 'hex').digest()

Java代码:

digest = MessageDigest.getInstance("SHA-256");
byte[] encodedhash = digest.digest(seedString);

最佳答案

这两个代码将为您提供相同的输出

NodeJS

var data = "seed";
var crypto = require('crypto');
crypto.createHash('sha256').update(data).digest("hex");

Java

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());
    }
}

了解更多详情:

NodeJS link
Java link

正如其他人所指出的,这取决于如何呈现数据。如果在 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的作用

关于java - SHA-256 - NodeJS 和 Java 代码之间不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50425424/

相关文章:

active-directory - 为没有证书模板的 PKCS#10 CSR 颁发证书。 0x80094801 MS W2K3 企业 CA

hash - 在 Mathematica 中以字符串形式给出的数据的加密散列(sha1 或 md5)

java - 两幅图像之间的碰撞检测

java - 如何将循环的结果放入带有索引的字符串中?

java - 函数结果 AS 类字段值

java - 从 Java 程序中搜索的 SQL 命令

node.js - 如何使用node.js为新创建的文件夹授予读写权限

node.js - AspNetCore NodeServices 抛出 NodeInitationException

javascript - 如何对在 Node.js 中使用 promise 和事件发射器的函数进行单元测试?

java - d * e mod phi == 1 对于 RSA key 对并不总是正确