openssl — генерирует переполнение стека

Мне интересно, есть ли способ создать Криптографический одноразовый номер используя библиотеки OpenSSL или Crypto ++. Есть ли что-то большее, чем просто генерирование набора случайных байтов с использованием пулов с автозаполнением?

2

Решение

Мне интересно, есть ли способ генерировать криптографический одноразовый номер с использованием библиотек OpenSSL или Crypto ++.

Crypto ++:

SecByteBlock nonce(16);
AutoSeededRandomPool prng;

prng.GenerateBlock(nonce, nonce.size());

OpenSSL:

unsigned char nonce[16];
int rc = RAND_bytes(nonce, sizeof(nonce));
unsigned long err = ERR_get_error();

if(rc != 1) {
/* RAND_bytes failed */
/* `err` is valid    */
}

/* OK to proceed */

Есть ли что-то большее, чем просто генерирование набора случайных байтов с использованием пулов с автозаполнением?

Одноразовый номер — это в основном IV. Его обычно считают публичным параметром, таким как IV или Соль.

Одноразовый номер должен быть уникальным в контексте безопасности. Вам также может понадобиться одноразовый номер, чтобы быть непредсказуемым.

Уникальность и непредсказуемость — это два разных свойства. Например, счетчик, начинающийся с 0000000000000000 уникален, но также и предсказуем.

Когда вам нужна уникальность и непредсказуемость, вы можете разделить одноразовый номер на случайное значение и счетчик. Случайное значение займет 8 байтов одноразового номера 16 байтов; в то время как счетчик займет оставшиеся 8 байтов одноразового номера 16 байтов. Затем вы используете функцию приращения, чтобы в основном выполнить i++ каждый раз, когда вам нужно значение.

Вам не нужно 8-8 сплит. 12-4 работает, как и 4-12. Это зависит от приложения и количества одноразовых номеров, необходимых перед повторным вводом. Повторное нажатие обычно зависит от количества байтов в простом тексте.

16-0 тоже работает. В этом случае вы используете случайные значения, избегая счетчика и избегая функции приращения. (Функция инкремента в основном является каскадным добавлением).

NIST SP800-38C а также SP800-38D Предложите несколько методов для создания одноразовых номеров, потому что CCM и GCM используют их.

Также см Каковы требования nonce? на бирже крипто стека.

5

Другие решения

Вам нужен уникальный номер для каждого одноразового номера. Вы можете использовать либо серийный номер, либо случайное число. Чтобы обеспечить уникальность, обычно, хотя и не обязательно, добавлять временную метку к одноразовому номеру. Либо передать временную метку как отдельное поле, либо объединить ее с одноразовым номером. Иногда также добавляется такая информация, как IP-адреса и идентификаторы процессов.

Когда вы используете серийный номер, вам не нужно беспокоиться о пропуске номеров. Все в порядке. Просто убедитесь, что вы никогда не повторите. Он должен быть уникальным при перезапуске вашего программного обеспечения. Это одно место, где может помочь добавление метки времени. Поскольку время в миллисекундах + серийный номер почти наверняка уникально при перезапуске сервера.

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

Возможно, вы захотите хешировать одноразовый номер, чтобы скрыть данные в нем (например, идентификатор процесса), хотя хеш будет безопасным только в том случае, если вы включите безопасное случайное число в одноразовый номер. В противном случае для наблюдателя одноразового номера может оказаться возможным угадать компоненты и проверить их, переделав хэш (т. Е. Они угадывают время и пробуют все возможные идентификаторы процедур).

2

Нет. Если одноразовый номер достаточно велик, то DRBG с автоматическим заполнением (детерминированный генератор случайных битов — номенклатура NIST) — это нормально. Я хотел бы предложить одноразовый номер около 12 байтов. Если одноразовый номер должен быть 16 байтов, вы можете оставить младшие значащие биты — чаще всего самые правые байты — равными нулю для максимальной совместимости.

Просто использовать криптографически безопасные генераторы случайных чисел, предоставляемые API, должно быть хорошо — они должны быть заполнены с использованием информации, полученной из операционной системы (возможно, среди других данных). Это никогда не повредит добавлять системное время для начальных данных просто чтобы быть уверенным.

В качестве альтернативы вы можете использовать серийный номер, но это потребует от вас сохранения некоторого состояния, которое может быть сложным при вызовах. Помните, что существует много ловушек, которые могут позволить часам повториться (летнее время, изменения ОС, разряженная батарея и т. Д. И т. Д.).

Никогда не повредит дважды проверить, что генератор случайных чисел не повторяется для достаточно большого выхода. Были проблемы только с программированием или ошибками конфигурации системы, например когда исправление после статического анализа кода для Debian приводило к тому, что OpenSSL RNG не заполнялся совсем.

2
По вопросам рекламы [email protected]