downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

PHP и HTML> <Использование PHP
[edit] Last updated: Fri, 25 May 2012

view this page in

Безопасное хэширование паролей

В этом разделе разъясняются причины, стоящие за хэшированием паролей в целях безопасности, а также эффективные методы хэширования.

Почему я должен хэшировать пароли пользователей в моем приложении?

Хэширование паролей является одним из самых базовых соображенй безопасности, которые необходимо сделать, при разработке приложения, принимающего пароли от пользователей. Без хэширования, пароли, хранящиеся в базе вашего приложения, могут быть украдены, например, если ваша база данных была скомпрометирована, а затем немедленно могут быть применены для компрометации не только вашего приложения, но и аккаунтов ваших пользователей на других сервисах, если они не используют уникальных паролей.

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

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

Почему популярные хэширующие функции, такие как md5() и sha1() не подходят для паролей?

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

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

Если популярные хэширующие функции не подходят, как же я тогда должен хэшировать свои пароли?

При хэшировании паролей существует два важных соображения: это стоимость вычисления и соль. Чем выше стоимость вычисления хэширующего алгоритма, тем больше времени требуется для взлома его вывода методом "грубой силы".

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

Первой такой функцией является crypt(), в которой встроена поддержка нескольких хэширующих алгоритмов. Использование этой функции гарантирует наличие выбранного вами алгоритма, т.к. PHP содержит встроенную реализацию каждого поддерживаемого алгоритма, в случае отсутствия данного алгоритма в вашей операционной системе.

Второй хэширующей функцией является hash(), которая поддерживает намного больше алгоритмов и их вариаций, чем crypt(), но не поддерживает некоторые алгоритмы, доступные в crypt(). Расширение Hash включено в поставку PHP, но может быть отключено при компиляции, поэтому его наличие не гарантируется, в отличие от функции crypt(), входящей в ядро PHP.

Рекомендуемым к использованию алгоритмом является Blowfish, так как он имеет намного более высокую стоимость вычисления, чем MD5 или SHA1, являясь в то же время масштабируемым.

Что такое соль?

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

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



add a note add a note User Contributed Notes Хэширование паролей
alice2287 at live dot com 13-Mar-2012 04:25
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.

 
show source | credits | stats | sitemap | contact | advertising | mirror sites