Как генерировать пригодные для использования в качестве 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".


Ответы (0 шт):