Есть ли преимущество этого хеша для безопасности? - PullRequest
3 голосов
/ 20 января 2011

Есть ли какое-либо преимущество у

sha1(sha1(sha1($password. $salt)));

По сути, наличие нескольких стихов sha1 только для одного sha1

sha1($password. $salt);

Ответы [ 4 ]

9 голосов
/ 20 января 2011

Не повторяю, НЕ пытайтесь сделать ваш хэш-пароль более безопасным, выполняя "особые" действия, которые делают ваш хэш.

Прежде всего, sha1(sha1(sha1($input))) имеет только для побочного эффекта увеличение вероятности столкновения * на каждой итерации. Увеличение вероятности столкновения - очень плохая вещь.

Вместо того, чтобы попробовать свои силы в криптологии "сделай сам", почему бы не доверять библиотекам, созданным настоящими экспертами в этой области? Используйте Portable PHP хэширование паролей .

PHPass на самом деле использует bcrypt , который является алгоритмом, разработанным для предотвращения атак с использованием радужных таблиц, словаря и перебора. Вы можете инициализировать его несколькими раундами: чем больше раундов, тем больше времени требуется для вычисления хэша. Таким образом, вы можете создавать более сильные хеши, если мощность процессора увеличивается.


* Первый вызов sha1() принимает бесконечный ввод и создает один из 2160 выходов. Вторая итерация принимает 2160 входов и создает один из x выходов, где x <= 2160. Третья итерация принимает x вход и создает один из y выходов, где y <= x <= 2160.

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

2 голосов
/ 20 января 2011

Да, это называется усиление ключа (но обычно это делается тысячи раз), и соль должна добавляться на каждой итерации для лучшей энтропии:

$hash = sha1($password . $salt);

for ($i = 1; $i <= 65000; ++$i)
{
    $hash = sha1($hash . $salt);
}

Кроме того, прочитайте это потрясающее сообщение в блоге - или хотя бы короткую цитату:

Чем лучше вы сможете оптимизировать функцию хеширования паролей, тем быстрее будет работать функция хеширования паролей, тем слабее ваша схема,MD5 и SHA1, даже обычные блочные шифры, такие как DES, предназначены для быстрой работы.MD5, SHA1 и DES - слабые хэши паролей.На современных процессорах необработанные криптоблоки, такие как DES и MD5, могут быть нарезаны битами, векторизованы и распараллелены для быстрого поиска паролей.Реализация FPGA с окончанием игры стоит всего несколько сотен долларов.

Использование необработанных хеш-функций для аутентификации паролей столь же наивно, как и использование несоленных хеш-функций.Не надо.

Каков уровень техники здесь?

Во-первых, что ваша операционная система уже дает вам: схема паролей «оптимизирована», чтобы быть вычислительно дорогой.Наиболее известной из них является схема PHK FreeBSD MD5.

Разница между схемой PHK и схемой, которую вы собирались использовать для приложения социальной корзины для покупок 2.0, проста.Вы просто собирались запустить MD5 на соли и пароле и сохранить хэш. PHK запускает MD5 в течение тысяч итераций.Это называется «растяжение».

1 голос
/ 20 января 2011

Короткий ответ - нет. Когда вы объединяете два алгоритма хеширования, все, что вы делаете, - это создаете еще один алгоритм хеширования с неизвестными свойствами (с точки зрения безопасности). Используйте соль (или даже лучше, HMAC).

0 голосов
/ 20 января 2011

Чем больше раз приходится проходить через процесс хеширования, тем больше времени требуется для хэширования и тем меньше попыток атакующий получает в день. Если для хеширования один раз требуется 10 мс, а для хеширования десять раз - 100 мс, то злоумышленник может попытаться набрать 6000 паролей в минуту при хешировании один раз и 600 в минуту при хешировании в десять раз. Конечно, для веб-приложения попытка грубой силы со скоростью 6000 или 600 в минуту - это по сути атака DOS. Криптографические хеши, как правило, занимают некоторое время для этой цели, а также часто хешируют несколько раз.

Вы, вероятно, должны использовать sha512 вместо sha1, что вы можете сделать с hash(), как hash('sha512',$stringtobehashed);, sha512 также занимает примерно в 5 раз больше времени, чем sha1 для хэширования.

...