2015-08-20 3 views
3

я получаю шестнадцатеричные цифры для создания уникальных случайных активаторов ссылок, такие как:Безопасных случайного размера шестнадцатеричного в битах, чтобы предотвратить грубую силу

hostname/account/confirm/$randomHex 

путем поиск, на самом деле, мой случайные шестигранный с помощью PHP может быть:

bin2hex(openssl_random_pseudo_bytes(16))

Над генерирует строку с 32 шестнадцатеричных цифр, и я был бы признателен, чтобы использовать меньше длины в 12 шестнадцатеричных цифр.

Принимая во внимание энергетическую обработку компьютеров, чем безопаснее минимальный размер шестнадцатеричного кода, который я могу использовать?

+0

imo, Как вы это делаете, сгенерируйте случайное число из 16 байтов, а затем «base64url_encode». Для функций см. [Url safe base64 кодирование и декодирование в PHP] (http://www.katcode.com/url-safe-base64-encoding-in-php/). Также: ['base64url' вариант кодирования] (http : //php.net/manual/en/function.base64-encode.php#103849). Они безопасны везде и безопасно –

ответ

2

Принимая во внимание энергетическую обработку компьютеров, какой более безопасный минимальный размер шестнадцатеричного кода, который я могу использовать?

Это действительно простое число для расчета, если у вас есть модель угрозы на месте.

Основываясь на указанном вами URL-адресе, кажется, что вы создаете URL-адрес для проверки прав собственности на электронную почту. Это явно необходимо, чем, скажем, URL-адрес сброса пароля.

Если вы оцениваете неудачные попытки ограничения (т. Е. Заблокируете свой IP-адрес от возможности повторить попытку в течение 24 часов), вы можете получить 8 шестнадцатеричных символов (32 бита), что означает, что они смогут угадать действительная ссылка подтверждения после 65536 попыток с вероятностью 50%. (The Birthday paradox.) Для снятия этого запроса также потребуется 65 536 IP-адресов, чтобы слепо подтвердить чей-то адрес электронной почты (возможно, не свой).

ОДНАКО!

Как указано выше, если вы используете это для, например. функция восстановления (я забыл свой пароль), не скупитесь на длину строки. 128 бит (32 шестнадцатеричных, 16 необработанных двоичных) следует считать нижней границей. Я бы сказал, стрелять на 256 бит, чтобы быть в безопасности.

Выше генерирует строку с 32 шестнадцатеричными цифрами, и я был бы признателен, если использовать меньшую длину как 12 шестнадцатеричных цифр.

Если вы хотите повысить безопасность строки с фиксированной длиной, единственный способ сделать это - увеличить количество возможных значений для каждого символа в строке.

Даже если вы использовали исходный двоичный код, которого нет, верхний предел в 11 символов составляет 88 бит энтропии. Указание hex разрезает вас до 44 (но, скорее всего, 40, так как вы, вероятно, напишите bin2hex(random_bytes(5)) здесь).

Если вы хотите надежно создать строку фиксированного размера с произвольным алфавитом, ознакомьтесь с this StackOverflow answer.

0

16 случайно созданных байтов дает 128 бит энтропии. Ключ с 128 бит энтропии - uncrackable using an offline brute force attack. Даже с каждым компьютером в мире, работающим над его взломом.

Однако вы стремитесь избегать атаки онлайн-грубой силы, которая намного медленнее. Если вы хотите 12 шестнадцатеричных символов, это будет 6 байтов и, следовательно, 48 бит энтропии.Это дает вам 281 474 976 710 656 возможностей. Если ваш сайт занимает 0.25 * секунд, чтобы ответить, это займет 2^47 * 0.25 = 35,184,372,088,832 секунд, чтобы в среднем выполнить запросы на ваш сайт (1.116 миллионов лет).

Вы в безопасности с 48 бит.

* На самом деле это будет параллельная атака, поэтому злоумышленнику не придется ждать ответа, если все, что они пытаются сделать, это проверить учетную запись. Тем не менее, для любой системы будет ограничение скорости, замедляющее атаку. При необходимости отрегулируйте фигуры в соответствии с вашей системой.

 Смежные вопросы

  • Нет связанных вопросов^_^