Как я могу получить хэш sha1 строки в node.js? - PullRequest
92 голосов
/ 08 августа 2011

Я пытаюсь создать сервер веб-сокетов, написанный на node.js

Чтобы заставить сервер работать, мне нужно получить SHA1-хэш строки.

Что мне нужно сделать, объяснено в Разделе 5.2.2 на странице 35 документации .

ПРИМЕЧАНИЕ: Например, если значение "Sec-WebSocket-Key" заголовок в рукопожатии клиента был "dGhlIHNhbXBsZSBub25jZQ==", сервер добавил бы строку "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", чтобы сформировать Строка "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11". Затем сервер получит хэш SHA-1 этой строки, предоставив значение 0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6 0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xea. Затем это значение кодируется в base64, чтобы получить значение "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", которое будет возвращено в заголовке "Sec-WebSocket-Accept".

Ответы [ 4 ]

213 голосов
/ 08 августа 2011

См. Функцию crypto.createHash() и соответствующие функции hash.update() и hash.digest():

const crypto = require('crypto')
  , shasum = crypto.createHash('sha1');
shasum.update('foo');
console.log(shasum.digest('hex'));
// "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"
21 голосов
/ 18 марта 2015

Обязательно: SHA1 не работает , вы можете столкнуться с кредитами AWS средней когорты стартапов, но для ответа на ваш вопрос:

var getSHA1ofJSON = function(input){
    return crypto.createHash('sha1').update(JSON.stringify(input)).digest('hex')
}

Тогда:

getSHA1ofJSON('whatever')

или

getSHA1ofJSON(['whatever'])

или

getSHA1ofJSON({'this':'too'})
8 голосов
/ 08 августа 2011

Пожалуйста, прочитайте и строго учтите мой совет в комментариях к вашему посту. При этом, если у вас все еще есть веская причина для этого, посмотрите этот список модулей crpyto для Node. Имеет модули для работы как с sha1, так и с base64.

4 голосов
/ 11 июня 2018

Советы по предотвращению проблемы (плохой хэш):

Я обнаружил, что NodeJS хэширует UTF-8 представление строки. Другие языки (например, Python, PHP или PERL ...) хэшируют строку байта.

Мы можем добавить двоичный аргумент , чтобы использовать строку байтов.

const crypto = require("crypto");

function sha1(data) {
    return crypto.createHash("sha1").update(data, "binary").digest("hex");
}

sha1("Your text ;)");

Вы можете попробовать: "\ xac", "\ xd1", "\ xb9", "\ xe2", "\ xbb", "\ x93" и т. Д. *

Другие языки (Python, PHP, ...):

sha1("\xac") //39527c59247a39d18ad48b9947ea738396a3bc47

Nodejs:

sha1 = crypto.createHash("sha1").update("\xac", "binary").digest("hex") //39527c59247a39d18ad48b9947ea738396a3bc47
//without:
sha1 = crypto.createHash("sha1").update("\xac").digest("hex") //f50eb35d94f1d75480496e54f4b4a472a9148752
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...