В base64 разрядах вы можете сохранить до 6 бит (2**6 == 64
).Как использовать urandom для генерации всех возможных символов base64?
Это означает, что вы можете поместить 3 байта в 4 base64 цифры.
64**4 == 2**24
Вот почему:
0x000000 == 'AAAA'
0xFFFFFF == '////'
Это означает, что случайная последовательность из 3-х байт эквивалентно base64 строка 4-х символов.
Однако, если я преобразовываю количество байтов, которое не является кратным 3 в строке base64, я не смогу создать всю комбинацию строки base64.
Давайте рассмотрим пример:
- Если я хочу случайное 7 символов base64 строку, я должен был бы генерировать 42 случайных битов (
64**7 == 2**42
).
Если я использую urandom для получения 5 случайных байтов, я получу только 40 бит (5 * 8), и если запросить 6, я получу 48 бит (6 * 8).
Могу ли я запросить 6 байтов и использовать маску, чтобы сократить ее до 5 или она сломает мой случайный передел?
Одно из решений:
hex(0x123456789012 & 0xFFFFFFFFFF)
'0x3456789012'
Еще один:
hex(0x123456789012 >> 8)
'0x1234567890'
Что вы думаете?
Поскольку вы получаете случайные байты из урбанда, вы также можете указать, что вы получаете случайные биты. Поэтому вы должны действительно вызывать 6 байтов и игнорировать 6 бит, чтобы получить 42 бита. Если вы решите отказаться от первых 6 или последних 6 бит, в этом случае это не имеет значения. – dmaij
, но вы должны хотя бы использовать/dev/random вместо/dev/urandom, чтобы улучшить вашу энтропию. – dmaij
Если я правильно понял, то другое решение всегда будет генерировать несколько из трех байтов base64 и вырезать строку до количества символов, которые мы хотим держать? – Natim