Рейтинг:2

Небезопасно ли создавать одноразовый номер с помощью генератора случайных чисел и алгоритма хеширования с секретным ключом, таким как HMAC?

флаг ag

Я создаю проект на микроконтроллере Arduino Mega, и мне нужен генератор одноразовых номеров для обмена вызовами и ответами. Но мне не удалось найти генераторы буквенно-цифровых строк. Тогда мне пришла в голову идея сделать его с помощью случайный() функция, которая генерирует случайное целое число в ограничении, которое вы даете, и хеширует это целое число с помощью HMAC, используя другой секретный ключ (тот, который может быть автоматически сгенерирован при запуске, поскольку он не должен быть согласованным).

Делает ли этот подход мой nonce менее безопасным?

kelalaka avatar
флаг in
Используйте это, чем SHA256? https://www.codeproject.com/Articles/5311070/A-True-Random-Number-Generator-in-Arduino-AVR-ATme
krystof18 avatar
флаг ag
Я не уверен, что понимаю, что ты говоришь. Должен ли я вместо этого использовать SHA256 для хеширования случайного значения? Я использую HMAC, потому что я уже буду использовать эту библиотеку, и мне нужно сделать программу как можно меньше.
kelalaka avatar
флаг in
HMAC должен использоваться с хеш-функцией, которая должна быть вам доступна, или используйте HMAC по своему усмотрению, поскольку он разработан как PRF.
krystof18 avatar
флаг ag
Вы правы, у меня есть SHA256 в той же библиотеке. Каковы преимущества использования SHA256 по сравнению с HMAC? Я думаю, это будет быстрее вычислять одноразовый номер, верно?
kelalaka avatar
флаг in
Для вас HMAC вычислил двойной SHA-256, и вам не нужен хэш с ключом (иногда называемый Keyed MAC, но на самом деле HMAC — это метод построения семейств псевдослучайных функций (PRF)). SHA-256 должно быть достаточно для одноразовых номеров.
Manish Adhikari avatar
флаг us
В вашем дизайне ключевой частью, определяющей вашу безопасность, будет ваш генератор случайных чисел. Это должен быть безопасный генератор случайных чисел как для генерации ключей. Следующее используемое int может быть предсказуемым, но оно не должно повторяться, чтобы предотвратить повторные атаки.
Рейтинг:2
флаг cn

случайный() это мусор. Посмотреть некоторые исходники здесь.

Лучший способ генерировать одноразовые номера — использовать настоящий генератор случайных чисел, если только вы не хотите> 10 000 одноразовых номеров в секунду, что маловероятно в ситуации с микроконтроллером. Вы можете сделать это без какого-либо дополнительного оборудования, используя Библиотека энтропии Arduino. Библиотека использует естественный джиттер между часами AVR и сторожевым таймером. Это хорошо изученная область конструкции TRNG, обычно используемая в кольцевых генераторах. Или сверните свой собственный вариант (это не так сложно, если вы просмотрите исходный код).

Это не очень быстро (64 бита в секунду), но это даст вам действительно случайный 96-битный одноразовый номер менее чем за две секунды. Таким образом, вам не нужно отслеживать используемые одноразовые номера. И это доказательство перезагрузки.

Maarten Bodewes avatar
флаг in
Если у вас есть 96 бит, вы можете использовать их для заполнения CSPRNG, что обычно должно быть намного быстрее. Пол, вероятно, возразит, что TRNG более безопасен, но для практических целей я думаю, что хорошо подготовленный CSPRNG — это, как правило, путь вперед.
Paul Uszak avatar
флаг cn
Пол отмечает, что шифр с непрерывным потоком — это не одноразовый номер. В чем был вопрос.
Maarten Bodewes avatar
флаг in
Однако никому не требуется * один * одноразовый номер, поэтому, хотя это может быть так, я предполагаю, что вариант использования заключается в создании нескольких одноразовых номеров, и для этого требуется ГСЧ, если вы хотите рандомизировать их.
Рейтинг:2
флаг fr

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

Вы можете использовать HMAC с этим, и для использования с ним хеш-функции я бы рекомендовал SHA-256. Однако я бы не рекомендовал генерировать значение в HMAC, используя случайный потому что это может повториться, а затем и ваш одноразовый номер. В общем, вы не можете полагаться на качество PRNG в стандарте C и POSIX. Вместо этого вы можете использовать монотонно увеличивающийся счетчик, который гарантирует, что он никогда не будет повторяться, но вам нужно будет каким-то образом сохранять счетчик между использованиями.

krystof18 avatar
флаг ag
Проблема со счетчиком заключается в том, что микроконтроллер может потерять питание и счетчик сбросится.Но я мог бы использовать внешний RTC с отдельной батареей, что обеспечило бы неповторяемость хотя бы на несколько лет. Это плохая идея?
Maarten Bodewes avatar
флаг in
Также имеется EEPROM, которая представляет собой постоянную память. Проблема в том, что у него будет ограниченное количество записей. Однако, возможно, можно написать последовательный счетчик для каждого запуска, а затем иметь отдельный счетчик в памяти. Просто мысли вслух здесь.

Ответить или комментировать

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