cryto.createHash sha512 с шестнадцатеричным типом ввода

#javascript #node.js #cryptography #hex #sha512

#javascript #node.js #криптография #шестнадцатеричный #sha512

Вопрос:

Я пытаюсь получить тот же результат, который я получаю в http://jssha.sourceforge.net /

где

У меня есть слово «тестирование», о котором идет речь:

 var word = 'testing';
var hex = toHex(word); // '740065007300740069006e006700';
  

в jssha при выборе input type как HEX со значением hex переменной и SHA-512 я получаю следующий результат:

 6e42b2c2a6351036b78384212774135d99d849da3066264983e495b5f74dc922e3d361b8ea9c8527169757233ed0bd4e56b2c42aab0a21bbcca67219dc53b472
  

хотя я не могу добиться того же результата с помощью криптомодуля nodejs.

 require('crypto').createHash('sha512').update(hex).digest('hex')
  

выводит:

 9ad6d9053c6c420fe61ec2fffd094e3a325bc71708e18232fd764a5eb30315e38464e620ef0b55b92fbf6c809838652a72d9412b0398b28d61ca432962451de2
  

Итак, мне интересно, как я могу получить тот же результат, что и jssha, используя crypto module?

Спасибо

Ответ №1:

«тестирование» в шестнадцатеричном формате равно 74657374696e67, если вы используете utf8, что в значительной степени стандартно. То, что возвращает ваш метод toHex, предполагает utf16.

Для этого хэша на веб-сайте говорится:

 521b9ccefbcd14d179e7a1bb877752870a6d620938b28a66a107eac6e6805b9d0989f45b5730508041aa5e710847d439ea74cd312c9355f1f2dae08d40e41d50
  

Сделайте это в node.js для хэширования шестнадцатеричной строки:

 require('crypto').createHash('sha512').update(
  new Buffer("74657374696e67", "hex")
).digest('hex')
  

Узел дает вам тот же хэш. О, и это также дает вам тот же хэш:

 require('crypto').createHash('sha512').update("testing").digest('hex')
  

Комментарии:

1. спасибо @thejh, кажется new Buffer("74657374696e67", "hex") , метод возвращается Unknown encoding для меня. Кроме того, есть ли какой-либо способ заставить его использовать utf-16 вместо 8. Извините, я думаю, я застрял с этой кодировкой, поскольку она из внешнего веб-сервиса.

2. @ludicco: Конечно, вы можете просто сделать то же самое с шестнадцатеричной строкой utf16. «Неизвестная кодировка» связана с тем, что вы используете старую версию node, используйте 0.5.10 и измените на 0.6.0, когда она будет доступна.

3. еще раз спасибо @thejh, единственная проблема в том, что этот экземпляр запущен на heroku, и я боюсь, что сейчас они поддерживают только 0.47? в этом случае я не уверен, сможет ли метод, о котором вы упомянули, работать? если у вас есть какие-либо идеи о том, как я мог бы заставить это работать, это было бы очень ценно 😉

4. Не знаю, возможно, вы захотите спросить в #heroku о freenode.net . В качестве обходного пути вы можете использовать Buffer.fromHex из github.com/bnoordhuis/node-buffertools .

5. Сделайте require("buffertools") это в верхней части вашего файла и замените new Buffer("74657374696e67", "hex") на Buffer.fromHex("74657374696e67")