SHA-256 - несоответствие между NodeJS и Java-кодом - PullRequest
0 голосов

У меня есть этот код на Nodejs, мне нужно написать похожий на Java, но результаты отличаются.Я думаю, что проблема в шестнадцатеричном кодировании.Но я не понимаю, как это работает.

Код узла:

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

Код Java:

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

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Эти два кода дадут вам одинаковый вывод

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 ссылка Java-ссылка

Как указали другие, вопрос состоит в том, как вы представляете данные.Если в функции update вы ничего не указываете - как в решении, которое я дал выше - вы говорите, что интерпретируйте seed как закодированный с кодировкой UTF-8 по умолчанию.Каков перевод строки UTF-8 seed в шестнадцатеричном формате?ответ 73656564, как вы можете легко проверить, например, из этого онлайн-инструмента

Теперь давайте проверим.Давайте напишем:

NodeJS

var data = "73656564";
crypto.createHash('sha256').update(data, 'hex').digest('hex');

Вы также получите тот же результат.Вы сообщаете функции update, что данные, которые вы предоставляете, представляют собой представление hex и должны интерпретироваться как таковые

Надеюсь, это поможет прояснить роль hex

0 голосов
/ 19 мая 2018

Из nodejs Документация :

Обновляет содержимое хеша с данными данными, кодировка которых указана в inputEncoding и может быть 'utf8', 'ascii' или'latin1'.Если кодировка не указана, а данные представляют собой строку, применяется кодировка utf8.Если данные представляют собой буфер, TypedArray или DataView, то inputEncoding игнорируется.

Простыми словами это означает формат данных, которые вы предоставляете.

PS.

Код выглядит немного неверно при обновлении, вы бы предоставили данные, а не начальное число.

...