18

我需要在会话中经常使用密码。我正在使用由密码加密的密钥加密我的用户数据。所以有我的问题。在 php 会话中存储纯文本密码是否安全(不是 cookie,所以非客户端)?有没有更好的办法?还是我应该每次都向我的用户询问密码?

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

4

4 回答 4

35

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

如果您需要在会话期间为某事使用密码,您应该构建您的应用程序,使其从不使用明文密码,而是使用密钥派生函数从密码中派生密钥,然后将其用于敏感任务。这样,暴露用户密码的机会就会少得多。请记住,用户拥有的唯一安全性是只有他应该知道的密码的机密性。

于 2013-10-25T15:52:13.613 回答
11

如果这样做并且当黑客访问您的服务器时,他们将看到纯文本密码。永远不要存储纯文本密码(在任何地方)


关于一般问题。您向用户询问一次密码并根据存储的加密密码验证加密密码 - 假设在数据库中。如果它们相同,那么您将开始一个新会话。当用户下次尝试访问您的站点时,您将检查该用户的会话是否存在。因此无需在会话中存储密码。

于 2013-10-25T15:48:13.377 回答
8

永远不要在任何地方存储任何类型的敏感数据,除了您通常应该避免直接使用的数据库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'
}
于 2013-10-25T15:56:56.417 回答
3

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

在会话中存储密码是否明智甚至必要,可能不是。也许是出于缓存的原因,但即便如此,它还是很脆弱。

于 2013-10-25T15:46:34.950 回答