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

时间:2018-05-19 12:42:22

标签: 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);

2 个答案:

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

更多详情:

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

的作用

答案 1 :(得分:0)

来自nodejs documentation

  

使用给定数据更新哈希内容,其编码为   在inputEncoding中给出,可以是'utf8','ascii'或'latin1'。如果   没有提供编码,数据是一个字符串,一个编码   “utf8”被强制执行。如果数据是Buffer,TypedArray或DataView,那么   inputEncoding被忽略。

简单来说,它意味着您提供的数据格式。

PS。

代码在更新中看起来有点不对,你提供的数据不是种子。