Безопасно ли хранить пароль в сеансе?
Мне нужно часто использовать пароль в сеансе. Я шифрую свои пользовательские данные с помощью ключа, который шифруется паролем. Поэтому есть мой вопрос. Безопасно ли хранить пароли открытого текста в сеансе php (а не в файле cookie, так что не для клиентов)? Есть ли способ лучше? Или я должен просто спросить моего пользователя каждый раз для пароля?
Я шифрую закрытый ключ rsa с помощью пароля пользователя, используя phpseclib. Каждый раз, когда мне нужен доступ к ключу, мне нужен пароль. У меня есть два варианта: либо я сохраняю пароль или ключ, который, как я думаю, не очень хорош. Я не могу использовать пароль для шифрования, потому что хеш хранится в "открытом тексте" в базе данных...
Ответы
Ответ 1
Сохранение паролей с открытым текстом в любой точке любой емкости обычно является плохим. Сеансы безопасны как таковые, но только настолько безопасны, как остальная часть вашей серверной среды. Администраторы или другие пользователи, как законные, так и нечестные, могут иметь доступ к хранящимся на нем данным. Вы никогда не захотите обращаться с секретами своих клиентов, если сможете избежать этого; это также означает, что вы хотите избежать просмотра пароля пользователя ни при каких обстоятельствах, и вы должны создать свой код таким образом, чтобы пароль открытого текста был как можно короче, насколько это технически возможно.
Если вам нужно использовать пароль для чего-то во время сеанса, вы должны архивировать приложение, чтобы он никогда не использовал пароль открытого текста, но используйте функцию деривации ключа, чтобы получить ключ от пароля, который вы затем используете для своих чувствительных задач. Таким образом, гораздо меньше шансов выставить пароль пользователя. Помните, что единственная защита, которой обладает пользователь, - это секретность его пароля, который должен знать только он.
Ответ 2
Если это произойдет, и когда хакеры получат доступ к вашему серверу, они будут видеть пароли в виде обычного текста. Никогда не храните текстовые пароли (везде)
Об общем вопросе. Вы запрашиваете у пользователя один раз пароль и проверяете зашифрованный пароль на зашифрованном пароле, хранящемся - скажем, в базе данных. Если они совпадают, вы начинаете новый сеанс. Когда пользователь попытается получить доступ к вашему сайту, вы проверите, существует ли для этого пользователя сеанс. Таким образом, нет необходимости хранить пароль в сеансе.
Ответ 3
Никогда не храните какие-либо конфиденциальные данные в любом месте, кроме базы данных, вы, как правило, должны избегать непосредственного использования семейств MD5
и SHA
.
Тогда Какое решение?
Если вы внедряете систему аутентификации, затем сравниваете информацию клиента (обычно имя пользователя и пароль), затем создавайте специальный токен, а затем сохраняете его в сеансе или в файле cookie.
Пример
if ($username == 'someuser' AND $password == 'somepassword_hash'){
$token = md5(uniqid());
// database query with along with user_id and token
$_SESSION['_token'] = $token;
}
Сравнение токена
functon varifyToken($token){
// database query here
// SELECT user_id FROM sessions WHERE token = 'token_here'
}
Ответ 4
Никогда не храните пароли в открытом тексте. Помимо этого: да, сеансы в безопасности. Сеансы хранятся на сервере. Сами данные сеанса никогда не отправляются в браузер.
Разумно или даже необходимо хранить пароль в сеансе, возможно, нет. Возможно, по причинам кэширования, но даже тогда это непрозрачно.