关于php:在会话中存储密码是否安全?

Is it secure to store a password in a session?

本问题已经有最佳答案,请猛点这里访问。

我需要经常在会话中使用密码。我正在用密码加密的密钥加密我的用户数据。所以我有个问题。在PHP会话中存储纯文本密码(不是cookie,所以不是客户端)是否安全?有更好的方法吗?或者我应该每次都问我的用户密码吗?

我使用phpseclib用用户密码加密RSA的私钥。每次我想要进入钥匙,我都需要密码。我有两个选择:要么存储密码,要么存储密钥,我认为两者都不太好。我不能使用密码哈希进行加密,因为哈希存储在数据库的"明文"中…


在任何地方以任何身份保存明文密码通常是一个坏主意。会话也是安全的,但只有与服务器环境的其他部分一样安全。合法和恶意的管理员或其他用户可以访问存储在其上的数据。如果可以避免的话,你永远不想处理客户的秘密;这也意味着你在任何情况下都不想看到用户的密码,你应该以明文密码在技术上尽可能短的方式构建代码。

如果您需要在会话期间为某个内容使用密码,那么您应该设计应用程序,使其从不使用纯文本密码,而是使用密钥派生函数从密码派生密钥,然后将该密码用于敏感任务。这样暴露用户密码的机会就小得多。记住,用户拥有的唯一安全性是密码的保密性,只有他才应该知道。


如果这样做,当黑客访问您的服务器时,他们将看到纯文本的密码。从不存储纯文本密码(无论在何处)

关于一般问题。您向用户询问一次密码,并根据存储在数据库中的加密密码验证加密密码。如果它们相同,则启动新会话。当用户下次尝试访问您的网站时,您将检查此用户的会话是否存在。所以不需要在会话中存储密码。


除了数据库之外,不要在任何地方存储任何类型的敏感数据,通常应避免直接使用MD5SHA系列。

那解决办法是什么?

如果您正在实现身份验证系统,那么比较客户端信息(通常是用户名和密码),然后创建一个特殊的令牌,然后将其保存到会话或cookie中。

例子

1
2
3
4
5
if ($username == 'someuser' AND $password == 'somepassword_hash'){
    $token = md5(uniqid());
    // database query with along with user_id and token
    $_SESSION['_token'] = $token;
}

比较令牌

1
2
3
4
5
functon varifyToken($token){

    // database query here
    // SELECT user_id FROM sessions WHERE token = 'token_here'
}


不要以纯文本形式存储密码。除此之外:是的,会话是安全的。会话存储在服务器上。会话数据本身从不发送到浏览器。

在会话中存储密码是明智的还是必要的,可能不是。可能是因为缓存的原因,但即便如此,它仍然是片状的。