В этом разделе разъясняются причины, стоящие за хэшированием паролей в целях безопасности, а также эффективные методы хэширования.
Хэширование паролей является одним из самых базовых соображенй безопасности, которые необходимо сделать, при разработке приложения, принимающего пароли от пользователей. Без хэширования, пароли, хранящиеся в базе вашего приложения, могут быть украдены, например, если ваша база данных была скомпрометирована, а затем немедленно могут быть применены для компрометации не только вашего приложения, но и аккаунтов ваших пользователей на других сервисах, если они не используют уникальных паролей.
Применяя хэширующий алгоритм к пользовательским паролям перед сохранением их в своей базе данных, вы делаете невозможным разгадывание оригинального пароля для атакующего вашу базу данных, в то же время сохраняя возможность сравнения полученного хэша с оригинальным паролем.
Важно заметить, однако, что хэширование паролей защищает их только от компрометирования в вашем хранилище, но не обязательно от вмешательства вредоносного кода в вашем приложении.
Такие хэширующие алгоритмы как MD5, SHA1 и SHA256 были спроектированы очень быстрыми и эффективными. При наличии современных технологий и оборудования, стало довольно просто выяснить результат этих алгоритмов методом "грубой силы" для определения оригинальных вводимых данных.
Из-за той скорости, с которой современные компьютеры могут "обратить" эти хэширующие алгоритмы, многие профессионалы компьютерной безопасности строго не рекомендуют использовать их для хэширования паролей.
При хэшировании паролей существует два важных соображения: это стоимость вычисления и соль. Чем выше стоимость вычисления хэширующего алгоритма, тем больше времени требуется для взлома его вывода методом "грубой силы".
В поставке PHP существует две функции, которые осуществляют хэширование с помощью указанного алгоритма.
Первой такой функцией является crypt(), в которой встроена поддержка нескольких хэширующих алгоритмов. Использование этой функции гарантирует наличие выбранного вами алгоритма, т.к. PHP содержит встроенную реализацию каждого поддерживаемого алгоритма, в случае отсутствия данного алгоритма в вашей операционной системе.
Второй хэширующей функцией является hash(), которая поддерживает намного больше алгоритмов и их вариаций, чем crypt(), но не поддерживает некоторые алгоритмы, доступные в crypt(). Расширение Hash включено в поставку PHP, но может быть отключено при компиляции, поэтому его наличие не гарантируется, в отличие от функции crypt(), входящей в ядро PHP.
Рекомендуемым к использованию алгоритмом является Blowfish, так как он имеет намного более высокую стоимость вычисления, чем MD5 или SHA1, являясь в то же время масштабируемым.
Криптографическая соль представляет собой данные, которые применяются в процессе хэширования для предотвращения возможности разгадать оригинальный ввод с помощью поиска результата хэширования в списке заранее вычисленных пар ввод-хэш, известном также как "радужная" таблица.
Более простыми словами, соль - это кусочек дополнительных данных, которые делают ваши хэши намного более устойчивыми к взлому. Существует много онлайн-сервисов, предоставляющих обширные списки заранее вычисленных хэшей вместе с их оригинальным вводом. Использование соли делает поиск результирующего хэша в таком списке маловероятным или даже невозможным.