Хранение паролей

Задача
Необходимо сохранять пароли пользователей, чтобы они могли заходить на ваш веб-сайт.

Решение
Когда пользователь регистрируется, зашифруйте выбранный им пароль с помощью функции crypt() и сохраните зашифрованный пароль в базе данных пользователей:

// шифруем пароль
$encrypted_password = crypt($_REQUEST['password']);
// заносим переменную $encrypted_password в базу данных пользователей
$dbh->query('INSERT INTO users (username,password) VALUES (?,?)',
array($_REQUEST['username'],$encrypted_password));

Затем, когда пользователь попытается войти на ваш веб-сайт, зашифруйте представленный им пароль с помощью функции crypt() и сравните его с сохраненным и зашифрованным ранее паролем. Если два за-шифрованных значения совпадают, значит, пользователь предоставил верный пароль:

$encrypted_password =
$dbh->getOne('SELECT password FROM users WHERE username = ?',
array($_REQUEST['username']));
if (crypt($_REQUEST['password'],$encrypted_password) == $encrypted_password) {
// успешный вход
} else {
// неудачный вход
}

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


(Хотя такие неавторизованные доступы могут предвещать и другие проблемы безопасности.)

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

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


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

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Не храните пароли на своем сайте
Обнаружение SSL-соединения
Проверка данных с помощью хеширования
Проверка надежности пароля
Работа с потерянными паролями

Вернуться в раздел: PHP / 14. Шифрование и безопасность