在会话中存储密码是否安全?

20

我需要在会话中经常使用密码。我用密码加密我的用户数据,然后用一个被密码加密的密钥来加密它。所以我的问题是,将明文密码存储在php会话中(非客户端的cookie)是否安全?有没有更好的方式?或者我应该每次都要求用户输入密码?

我用phpseclib使用用户密码加密rsa的私钥。每次我想访问该密钥时,我都需要密码。我有两个选择:要么存储密码,要么存储密钥,但我认为两者都不是很好的选择。我不能使用密码哈希进行加密,因为哈希在数据库中以“明文”形式存储...


8
会话存储在服务器上,您只会在浏览器中得到一个用于会话 ID 的 cookie。 - Sam
8
就个人而言,我不认为明文密码存储在任何地方都是安全的。 - Jonathan Lonowski
也许可以使用密码的哈希值进行加密? - user133408
1
客户端存储的唯一内容是会话密钥,该密钥通过cookie或GET参数传播。 - Praveen Kumar Purushothaman
考虑加密密码。 - The Alpha
显示剩余5条评论
4个回答

37

在任何情况下保留明文密码通常都是一个不好的主意。会话本身是安全的,但只有在服务器环境足够安全的情况下才能如此。管理员或其他用户无论是合法的还是恶意的,都可能访问存储在其中的数据。如果可以避免,您永远不希望处理客户的密码;这也意味着您想要避免在任何情况下查看用户的密码,并且应该以技术上尽可能短暂的方式构建代码,使明文密码的存储时间最短。

如果需要在会话期间使用密码,则应设计您的应用程序,使其从不使用明文密码,而是使用密钥派生函数从密码中导出一个密钥,然后将其用于敏感任务。这样一来,曝露用户密码的机会就会大大减少。请记住,用户唯一拥有的安全性就是他所知道的密码的保密性。


4
是的,您可以选择将派生密钥存储在会话中,知道如果服务器被攻破,它可能会被泄露,但至少用户的密码仍然是安全的。这样,您的安全故障就不会成为那些在其他地方使用相同密码的用户的更大问题。 - grossvogel

12

如果这样做,黑客获取您的服务器访问权限后,将会看到明文密码。不要存储明文密码(无论何时)


关于这个普遍问题。您只需一次询问用户密码,然后将加密后的密码与存储在数据库中的加密密码进行验证。如果它们相同,则启动一个新的会话。当用户下次尝试访问您的网站时,您将检查是否存在该用户的会话。因此,不需要在会话中存储密码。


2
当黑客获取了您的服务器访问权限时,我不认为PHP会话数据是他可能首先读取的内容...如果他在服务器上,他可以获取和检索很多东西! - JoDev
是的,不是直接存储,但这些密码可能存储在像MySQL这样的SQL数据库中... 因此,他可以直接从源代码中读取所有密码!(当我们有能力黑客入侵服务器时,您可以打开MySQL...) - JoDev
3
希望黑客不会寻找会话数据有点天真 :) - user133408
2
@JoDev 不,只有它们的哈希值是可见的(你明白吗?) - hek2mgl
数据库中只有哈希值可见?这就是你的意思吗?(不是开玩笑,我理解得不太好^^) - JoDev
显示剩余3条评论

9

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

那么解决方案是什么?

如果您正在实现身份验证系统,请比较客户端信息(通常是用户名和密码),然后创建一个特殊的令牌,然后将其保存到会话或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

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

是否明智甚至需要将密码存储在会话中,可能不是必须的。也许出于缓存原因,但即使如此,也不可靠。


+1 给balance.coz加一分,因为没有任何负面投票。 - Nabin Kunwar
修改了答案以取消踩。 :) - Praveen Kumar Purushothaman
嗯,一开始并不清楚OP的意思是将密码以明文形式存储——这太荒唐了,我没能想到。 - Halcyon
是的,我想说的是,在答案被冻结之前刚刚有+1。 - JoDev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接