Я пытаюсь создать сервер 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"
заголовке.
Ответы:
См
crypto.createHash()
функции и связанные с нимhash.update()
иhash.digest()
функции:источник
Обязательно: SHA1 не работает , вы можете вычислить коллизии SHA1 за 45000 долларов США . Вам следует использовать
sha256
:Чтобы ответить на ваш вопрос и создать хеш SHA1:
Затем:
или
или
Официальная документация по узлам
crypto.createHash()
источник
Object.toString()
возвращается[object Object]
по умолчанию. Итакsha1sum({})
===sha1sum({"foo":"bar"})
===sha1sum({"a":1})
и т. Д.sha1sum
неточно, учитывая то, что вы сказали - это явно больше, чем то, что сделал бы обычный sha1. Я переименовал функцию в ответе.Пожалуйста, прочтите и внимательно примите во внимание мои советы в комментариях к вашему сообщению. При этом, если у вас все еще есть веская причина для этого, ознакомьтесь с этим списком модулей шифрования для Node . В нем есть модули для работы с sha1 и base64.
источник
Советы по предотвращению проблемы (плохой хеш):
Мы можем добавить двоичный аргумент для использования байтовой строки.
Вы можете попробовать: «\ xac», «\ xd1», «\ xb9», «\ xe2», «\ xbb», «\ x93» и т. Д.
Другие языки (Python, PHP, ...):
Nodejs:
источник
'binary'
- Псевдоним для'latin1'
nodejs.org/api/…binary
! Использованиеbinary
илиlatin1
в кодировке приведет к потере информации и увеличению вероятности коллизий! Попробуйте использовать приведенный выше фрагмент, например, с этими двумя:❤
и⑤
Ты можешь использовать:
Для установки:
источник