For those wishing to increase the computational cost of brute-forcing their password hashes by iterating the hash command multiple times, but don't want to increase the risk of a hash collision, simply re-append the password to the hash each iteration.
<?php
$iterations = 10;
$hash = crypt($password,$salt);
for ($i = 0; $i < $iterations; ++$i)
{
$hash = crypt($hash . $password,$salt);
}
?>
This, of course, can be used with md5(), sha1(), etc. as well as crypt().
Some other recommendations:
- Use the highest number of iterations possible without introducing a significantly noticeable delay to authenticating users, or causing more CPU use than your host will allow.
- Use a unique salt for each user, ideally a random one.
- Use a salt of at least 24 bytes, especially if you're using a weaker algorithm like MD5 or SHA-1.
Безопасное хэширование паролей
В этом разделе разъясняются причины, стоящие за хэшированием паролей в целях безопасности, а также эффективные методы хэширования.
- Почему я должен хэшировать пароли пользователей в моем приложении?
-
Хэширование паролей является одним из самых базовых соображенй безопасности, которые необходимо сделать, при разработке приложения, принимающего пароли от пользователей. Без хэширования, пароли, хранящиеся в базе вашего приложения, могут быть украдены, например, если ваша база данных была скомпрометирована, а затем немедленно могут быть применены для компрометации не только вашего приложения, но и аккаунтов ваших пользователей на других сервисах, если они не используют уникальных паролей.
Применяя хэширующий алгоритм к пользовательским паролям перед сохранением их в своей базе данных, вы делаете невозможным разгадывание оригинального пароля для атакующего вашу базу данных, в то же время сохраняя возможность сравнения полученного хэша с оригинальным паролем.
Важно заметить, однако, что хэширование паролей защищает их только от компрометирования в вашем хранилище, но не обязательно от вмешательства вредоносного кода в вашем приложении.
- Почему популярные хэширующие функции, такие как md5() и sha1() не подходят для паролей?
-
Такие хэширующие алгоритмы как MD5, SHA1 и SHA256 были спроектированы очень быстрыми и эффективными. При наличии современных технологий и оборудования, стало довольно просто выяснить результат этих алгоритмов методом "грубой силы" для определения оригинальных вводимых данных.
Из-за той скорости, с которой современные компьютеры могут "обратить" эти хэширующие алгоритмы, многие профессионалы компьютерной безопасности строго не рекомендуют использовать их для хэширования паролей.
- Если популярные хэширующие функции не подходят, как же я тогда должен хэшировать свои пароли?
-
При хэшировании паролей существует два важных соображения: это стоимость вычисления и соль. Чем выше стоимость вычисления хэширующего алгоритма, тем больше времени требуется для взлома его вывода методом "грубой силы".
В поставке PHP существует две функции, которые осуществляют хэширование с помощью указанного алгоритма.
Первой такой функцией является crypt(), в которой встроена поддержка нескольких хэширующих алгоритмов. Использование этой функции гарантирует наличие выбранного вами алгоритма, т.к. PHP содержит встроенную реализацию каждого поддерживаемого алгоритма, в случае отсутствия данного алгоритма в вашей операционной системе.
Второй хэширующей функцией является hash(), которая поддерживает намного больше алгоритмов и их вариаций, чем crypt(), но не поддерживает некоторые алгоритмы, доступные в crypt(). Расширение Hash включено в поставку PHP, но может быть отключено при компиляции, поэтому его наличие не гарантируется, в отличие от функции crypt(), входящей в ядро PHP.
Рекомендуемым к использованию алгоритмом является Blowfish, так как он имеет намного более высокую стоимость вычисления, чем MD5 или SHA1, являясь в то же время масштабируемым.
- Что такое соль?
-
Криптографическая соль представляет собой данные, которые применяются в процессе хэширования для предотвращения возможности разгадать оригинальный ввод с помощью поиска результата хэширования в списке заранее вычисленных пар ввод-хэш, известном также как "радужная" таблица.
Более простыми словами, соль - это кусочек дополнительных данных, которые делают ваши хэши намного более устойчивыми к взлому. Существует много онлайн-сервисов, предоставляющих обширные списки заранее вычисленных хэшей вместе с их оригинальным вводом. Использование соли делает поиск результирующего хэша в таком списке маловероятным или даже невозможным.
