В чем преимущество «случайной» соли над «уникальной» солью? - PullRequest
4 голосов
/ 13 августа 2011

В настоящее время я пишу программу, и часть ее включает безопасное создание хэшей паролей для хранения в базе данных, и я наткнулся на фреймворк phpass , который, как мне кажется, очень рекомендуется. В phpass они, кажется, проходят большую длину, чтобы получить соль, которая является действительно случайной, насколько это возможно, для использования в хешах (например, чтение из / dev / urandom).

Мой вопрос: в чем польза от этого по сравнению с простым использованием uniqid()? Разве не стоит просто убедиться, что соли, используемые для хэшей, отличаются друг от друга, а не случайно? Разве использование действительно случайной соли не будет на самом деле хуже, чем использование уникальной соли, поскольку она потенциально может вызвать столкновения, в то время как uniqid () не будет?

Редактировать: Мой вопрос был не о том, существует или нет «истинная» случайность в компьютерных средах, поэтому, возможно, я немного перефразировал ее, однако мой вопрос был больше похож на то, имеет ли «более» случайная соль какую-либо выгоду над большей уникальностью как соль.

Ответы [ 4 ]

1 голос
/ 13 августа 2011

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

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

0 голосов
/ 25 ноября 2014

В PHP функция uniqid() вычисляет свой результат на основе текущего времени.Это помогает гарантировать, что значения уникальны, потому что два раза не встречаются дважды, однако это не работает на нескольких серверах, поскольку основано исключительно на времени.Использование чего-либо, основанного на времени, плохо, потому что число различных значений, которые могут быть получены с помощью uniqid(), очень ограничено.Предполагая, что PHP использовался в течение 25 лет, он рассчитывает на 7,89e + 14 микросекунд, которые прошли, и, следовательно, было бы получено такое же количество значений для uniqid().

Это очень большое числоОднако, если предположить, что мы можем получить действительно случайную соль, вероятность столкновения на самом деле намного меньше, чем при использовании uniqid().Возможные символы, которые можно использовать в качестве соли:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

Это означает, что мы можем использовать 64 различных символа для соли длиной 22 символа, что примерно равно 5,44e + 39 различных комбинаций.

Таким образом, при попытке сделать что-то уникальное, на самом деле оно на меньше уникально, чем было бы, если бы использовался случайный источник.

0 голосов
/ 13 августа 2011

Майк, как я уже сказал в своем другом ответе, я не думаю, что это проблема солей, но если вы действительно обеспокоены истинной / псевдослучайностью, вы можете использовать числа из random.org. См. Разницу , а и посмотрите, как получить истинное случайное число в PHP .

0 голосов
/ 13 августа 2011

Я думаю, что это не имеет значения, поскольку соль также должна храниться вместе с хешированным паролем, поэтому злоумышленник все равно получит соль, и атака будет одинаковой, независимо от того, КАК вы сгенерировали соль.

(OT обсуждение: я утверждал, что не вижу большого преимущества использования соли для хранения паролей - как только злоумышленник получит соль для определенного хешированного пароля, он может в любом случае выполнить атаку по словарю ... это будет медленнеепотому что злоумышленник должен перефразировать словарь для каждой соли пароля, но .. md5 () быстр, как ад, и если атака занимает 5 минут или полдня, в чем реальная разница ... я не чувствую себя намного безопаснее с сольючем без.)

РЕДАКТИРОВАТЬ - заключение для обсуждения : Соль имеет большое значение время, необходимое для взлома паролей, но не используйте md5 () для хеширования паролей!Используйте очень медленную функцию хеширования, например, bcrypt () или, если вам нужно использовать md5 (), вызывайте ее много тысяч раз!

...