Я получаю шестнадцатеричные цифры для генерации уникальной случайной ссылки активаторов, например:
hostname/account/confirm/$randomHex
Поиском, на самом деле, мой случайный гекс с использованием PHP может быть:
bin2hex( openssl_random_pseudo_bytes(16) )
Выше генерирует строку с 32 шестнадцатеричными цифрами, и я хотел бы использовать меньшую длину как 12 шестнадцатеричных цифр.
Учитывая мощность обработки компьютеров, какой самый безопасный минимальный размер шестнадцатеричного числа я могу использовать?
Учитывая мощность обработки компьютеров, какой самый безопасный минимальный размер шестнадцатеричного числа я могу использовать?
Это на самом деле легко подсчитать, если у вас есть модель угрозы.
Судя по предоставленному вами URL, создается впечатление, что вы генерируете URL для подтверждения владения электронной почтой. Это, безусловно, нужно, чем, скажем, URL для сброса пароля.
Если вы ограничиваете количество неудачных попыток (т.е. блокируете их IP-адрес от возможности повторной попытки в течение 24 часов), вы можете обойтись с 8 шестнадцатеричными (32-битными) шансами, что означает, что они смогут угадать действительную ссылку подтверждения после 65,536 попыток с вероятностью 50%. (Парадокс дня рождения.) Для этого также потребуется 65 536 IP-адресов, чтобы слепо подтвердить чей-либо адрес электронной почты (вероятно, не свой).
ТЕМ НЕ МЕНИЕ!
Как указано выше, если вы используете это, например, для функция восстановления (я забыл свой пароль), не экономьте на длине строки. 128 бит (32 шестнадцатеричных, 16 необработанных двоичных файлов) должны рассматриваться как нижняя граница. Я бы сказал, стрелять на 256 бит, чтобы быть в безопасности.
Выше генерирует строку с 32 шестнадцатеричными цифрами, и я хотел бы использовать меньшую длину как 12 шестнадцатеричных цифр.
Если вы хотите повысить безопасность строки при фиксированной длине, единственный способ сделать это — увеличить количество возможных значений для каждого символа в строке.
Даже если вы использовали двоичный файл, которым вы не являетесь, верхний предел в 11 символов составляет 88 бит энтропии. Задание шестнадцатеричного кода сокращает вас до 44 (но, скорее всего, до 40, поскольку вы, вероятно, напишите bin2hex(random_bytes(5))
Вот).
Если вы хотите безопасно создать строку фиксированного размера с произвольным алфавитом, ознакомьтесь с этот ответ StackOverflow.
16 случайно сгенерированных байтов дают 128 битов энтропии. Ключ с 128 битами энтропии без взлома с помощью не в сети атака грубой силой. Даже с каждым компьютером в мире, работающим над его взломом.
Тем не менее, вы ищете, чтобы предотвратить грубую атаку онлайн, которая намного медленнее. Если вы хотите 12 шестнадцатеричных символов, это будет 6 байтов и, следовательно, 48 бит энтропии. Это дает вам 281 474 976 710 656 возможностей. Если ваш сайт занимает 0,25* секунд, чтобы ответить, это займет 2^47 * 0.25 = 35,184,372,088,832
в среднем за несколько секунд, чтобы сделать запрос на ваш сайт (1,116 миллиона лет).
Вы в безопасности с 48 битами.
* На самом деле это будет параллельная атака, поэтому злоумышленнику не придется ждать ответа, если все, что он пытается сделать, это проверить учетную запись. Тем не менее, будет ограничение скорости для любой системы, замедляющей атаку. При необходимости отрегулируйте цифры в соответствии с вашей системой.