Как генерировать пригодные для использования в качестве ID сессии случайные или хотя бы криптостойкие строку в Node.js?
Из ответа-лекции на вопрос Что именно идентифицирует посетителя сайта? про аутенцификацию с помощью сессий:
Случайная строка
<...>
- при первом посещении сайта у клиента ничего нет. Сайт замечает это, создаёт новую случайную строку (подлиннее, чтоб трудно было подобрать; символов 30 хотя бы) и вместе с обычным ответом на запрос тем или иным образом отправляет эту сгенерированную строку (Set-Cookie, редирект на специальную ссылку или просто в теле ответа, если это например JSON API)
<...>
Проблемы
- генератор случайной строки должен быть действительно случайным (или не совсем случайным, но криптостойким, не
uniqid()
), так как псевдослучайность злоумышленник может попытаться подобрать (например, подбор состояния генератора в PHP или Python, или подбор сессий, созданных черех uniqid(), в Invision Power Board). Ни в коем случае в качестве строки нельзя использовать хэш логина, хэш пароля, текущее время, одну-единственную заранее заготовленную строку и прочие неслучайные вещи, так как это сильно упрощает подбор. Как получить настоящую случайность, читайте в документации к вашему языку программирования. Или просто используйте готовую реализацию вродеsession_start()
в PHP;
Что же, мне выпала честь спросить, как получить действительно случайную или хотя бы криптостойкую строку в Node.js. Прекрасно знаю, что есть много сторонних пакетов, которые на этом специализируются, но задача этого вопроса - получить качественную выборку, потому что и пакеты многие давно уже заброшены, и не факт, что они действительно генерируют случайные строки, как об этом заявляют. Буду считать вопрос исчерпанным при наличии следующая информация:
- Нативное решение
- Имя модуля и метода, генерирующего случайную либо криптостойкую строку
- Сторонне решение
- Имя поддерживаемого (не заброшенного) пакета и метода, генерирующего случайную либо криптостойкую строку
Полагаю, нативным решением будет crypto.randomBytes()
, потому что согласно документации будет сгенерирована криптостойкая псевдослучайная строка:
Generates cryptographically strong pseudorandom data.
https://nodejs.org/api/crypto.html#cryptorandombytessize-callback
Наверное, ещё следует сказать, как я эту строку собираюсь использовать. На данный момент я собираюсь генерировать ID сессии по следующей формуле:
const sessionID = `${ pseudoRandomString }.${ sha256(pseudoRandomString + salt) }`
где у pseudoRandomString
длина составляет 36 символов, что больше рекомендованной величины, а криптографическая соль salt
будет, вообще-то говоря, такой же псевдослучайной строкой, как pseudoRandomString
, только каждый раз одинаковой, ибо негоже использовать соль наподобие "dog55"
.