Как использовать сгенерированное nonce в NodeJS и выполнять проверку без вызова базы данных?

Я генерирую var crypto = require ( 'crypto' ); крипто . randomBytes ( 32 , function ( err , bytes ) { if ( err ) { next ( err ); } else { next ( null , normalize ( bytes )); } }); для проверки шагов мастера для его защиты один за другим.

Я не знаю, как создать nonce в nodejs и сохранить его в базе данных, чтобы убедиться, что он может использоваться один раз.

Но мне было интересно, есть ли идея генерировать и проверять nonce как указано выше, как использовать только один раз и, если возможно, можно использовать в течение срока (истечения срока), не сохраняя его в базе данных, а просто возвращая его в клиент на одном шаге мастера и подтвердите его на следующем шаге.

Обычно я использую метод ниже, чтобы сгенерировать nonce, нормализовать его и сохранить в mongodb с истечением времени, чтобы mongodb удалил его по истечении определенного времени, если он не был использован.

hmac

Пожалуйста, предложите, если любой хороший / оптимизированный способ генерации nonce, чем это, и возможность позаботиться об одноразовом использовании и истечении срока действия без вызова базы данных.

node.js,mongodb,nonce,

3

Ответов: 3


2 принят

Всегда лучше иметь базу данных для хранения и проверки nonce. Чтобы ограничить со временем, либо вы можете использовать mongodb с истечением срока действия, либо вы можете сгенерировать временную метку, а затем сгенерировать временную метку timesamp 2^(128), nonce & private. Затем отправьте клиенту nonce, timestamp & hmac. Таким образом, вы можете защитить временную метку, а также ограничить время без указания времени, если ваша база данных не поддерживает истечение срока действия документа как mongodb. Надеюсь, это объяснит.


0

Возможно, у вас есть время бездействия без вызова базы данных, используя что-то вроде хеш-карты на сервере, чтобы хранить и извлекать nonce и проверять время. Если есть идентификатор сеанса или статический идентификатор пользователя, это поможет. Тем не менее, эта идея создания сервера, хранения, извлечения и поддержки nonce кажется сложной по сравнению с проверенным решением, таким как MongoDB. Существует еще одна морщина, которая будет иметь место в случае нескольких серверов для службы, где трафик должен быть постоянным, чтобы сеансы начали заканчиваться. Использование базы данных для единственного источника правды на исправлениях nonces.

Если причиной сохранения nonce на сервере узла является скорость / отставание, это может стоить дополнительного тестирования и кода. В этом случае тайм-аут для nonces должен быть проверен с регулярностью для истекших, чтобы поддерживать быстрый поиск.


0

Вам не нужны базы данных.

Если вы используете криптографическое случайное число с 128 бит, у вас есть base64возможности чисел. Рассматривая четный, равномерно распределенный генератор случайных чисел и вы вызываете такую ??функцию один раз в секунду, вероятность повторения будет почти равна нулю.

Вы можете использовать что-то вроде этого в узле (здесь конверсия )const crypto = require('crypto'); var nonce = crypto.randomBytes(16).toString('base64');

p=1/(2^128)

128 бит - 16 байт.

Математическая демонстрация

Функция массы вероятности биномиального распределения, которая применима, равна

введите описание изображения здесь

Эти функции возвращают вероятность получения ровно k успехов в течение n испытаний, причем p - вероятность успеха для каждого испытания.

В нашем случае k.

Кумулятивная функция

введите описание изображения здесь

где kна сумму «пол» под k, т. е. наибольшее целое число, меньшее или равное k. Эта кумулятивная функция дает, вероятность наличия числа успехов между 0 и k .

Но нам нужна вероятность хотя бы одного успешного испытания, поскольку мы не хотим повторения. И учитывая, что

введите описание изображения здесь

таким образом

введите описание изображения здесь

что означает для k=1этого

введите описание изображения здесь

в нашем случае, если мы будем называть нас nonce один раз в секунду в течение 100 лет , мы получаемn=1*60*60*24*365.25*100=3155760000

Следовательно

p=1/(2^128);
n=3155760000;

Применяя формулу

введите описание изображения здесь

Заключение

Если вы используете 128 бит nonce, и вы вызываете nonce один раз в секунду в течение 100 лет, вероятность повторения указанного nonce в течение этого периода в 100 лет почти равна нулю, что означает почти невозможность. Это означает, что вам не нужны базы данных.

Node.js, MongoDB, одноразовое значение,
Похожие вопросы