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