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

Я пытаюсь создать сервер websocket, написанный в 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".

Ответ 1

См. crypto.createHash() и связанные функции hash.update() и hash.digest():

const crypto = require('crypto')
  , shasum = crypto.createHash('sha1');
shasum.update('foo');
console.log(shasum.digest('hex'));
// "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"

Ответ 2

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

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

Тогда:

getSHA1ofJSON('whatever')

или

getSHA1ofJSON(['whatever'])

или

getSHA1ofJSON({'this':'too'})

Ответ 3

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

Ответ 4

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

Я обнаружил, что 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