Рейтинг:2

Насколько менее безопасными были эти случайные байты?

флаг kn

В нашей кодовой базе Python были сгенерированы некоторые случайные байты, которые мы хотели обеспечить криптографической защитой. Раньше код был такой:

возможность = "".join(secrets.choice(string.digits) для i в диапазоне (33))

Я изменил его на:

возможность = secrets.token_bytes(16)

По моей оценке, первая версия выбирала 33 раза между 10 цифрами и, таким образом, имела 33*log2(10) = 110 бит энтропии, а второе имеет 128 бит энтропии. Верен ли этот расчет?

poncho avatar
флаг my
«Насколько менее безопасными были эти случайные байты»; это также зависит от того, что вы сделали с этими байтами. Например, если вы использовали их как ключ AES-128, что ж, это означает, что вы, скорее всего, использовали только первые 16 байтов первого примера, что *значительно* хуже, чем "110-битная безопасность"
Maarten Bodewes avatar
флаг in
Я согласен с Пончо. Я не вижу ничего плохого в ваших вычислениях, но это зависит от того, как используются цифры (и, учитывая метод их генерации, это может быть как хорошим, так и плохим способом). Еще одна вещь заключается в том, что если это считается числом, вы можете получить несколько ведущих нулей, которые могут быть удалены до того, как значение будет использовано. Это снова зависит от кода после этого, оказывает ли это значительное влияние или нет.
Maarten Bodewes avatar
флаг in
Остерегайтесь утиной печати, используемой в Python. Строка, состоящая из цифр или байтов, совсем другая. Мне не нравится использовать строки для двоичных значений; если бы я разработал API, я бы просто принял [`bytes` или `bytearray`](https://www.w3resource.com/python/python-bytes.php) для Python 3
флаг kn
Мы используем все это, чтобы сделать неугадываемый URL (с base64).
Рейтинг:3
флаг us

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

При рассмотрении случайности следует помнить о двух вещах: непредсказуемости и единообразии.

  • Не ваш случай, но если вы используете встроенные функции Python, например случайный, у вас есть единообразие, но не непредсказуемость, потому что он использует PRNG. Итак, говоря криптографически по законам Керхоффа, вы получаете 0 энтропии.
  • Если вы используете секреты. Он использует (например, в Linux) /dev/urandom который обычно считается криптографически безопасным *, за исключением некоторых случаев (например, при загрузке) вы получаете оцененный количество энтропии (на самом деле вы не можете его измерить), которое, как вы надеетесь, немного меньше вашего теоретического.

* Ведутся/были постоянные дебаты о том, следует ли использовать /dev/urandom или же /dev/случайный. Вы можете прочитать больше здесь и вы также можете ознакомиться с комментарием SAI Peregrinus ниже.

Paul Uszak avatar
флаг cn
Эээ, что вы имеете в виду _ «использование печатных цифр для хранения случайности — это компромисс между хранением и удобочитаемостью» _? Вас интересует емкость хранилища?
SAI Peregrinus avatar
флаг si
Эта «продолжающаяся дискуссия» уже давно не является дискуссией. Текущие ядра Linux *нет* различий в поведении между /dev/random и /dev/urandom. Они блокируются при загрузке до заполнения пула, а затем не блокируются.

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

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