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

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

Решение
Когда пользователь регистрируется, зашифруйте выбранный им пароль с помощью функции 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() зашифрованный текст обратно в простой текст. Это делает сохраненные пароли более защищенными, но это также означает, что вам не удастся получить пользовательские пароли в легко читаемом виде, даже если это будет необходимо. Поэтому, если пользователь, к примеру, забыл свой пароль, вы не сможете ему сообщить этот же самый пароль. Лучшее, что вы сможете сделать, – это установить новое значение пароля и сообщить пользователю его новый па-
роль.
Теги:
защита, шифрование, пароли
Добавлено: 22 Июля 2018 13:49:39 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...