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

时间:2013-10-25 15:43:57

标签: php security session encryption

我需要在会话中经常使用密码。我正在使用密码加密的密钥来加密我的userdata。所以有我的问题。在php会话中存储明文密码是否安全(不是cookie,非客户端)?有没有更好的办法?或者我应该每次只问我的用户密码?

我使用phpseclib使用userpassword加密rsa的私钥。每次我想要访问密钥时我都需要密码。我有两个选择:我存储密码或密钥,我认为这两个都不是很好。我不能使用passwordhash进行加密,因为哈希存储在数据库中的“plaintext”中...

4 个答案:

答案 0 :(得分:30)

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

如果您需要在会话期间使用密码,则应构建应用程序以使其永远不会使用明文密码,但使用key derivation function 从密码中导出密钥然后您将其用于敏感任务。这样,公开用户密码的机会就会减少很多。请记住,用户唯一的安全措施是密码的保密,只有他应该知道。

答案 1 :(得分:9)

如果这样做并且当黑客访问您的服务器时,他们将以纯文本形式看到密码。永远不要存储纯文本密码(无论在哪里)


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

答案 2 :(得分:7)

永远不要将任何类型的敏感数据存储在除数据库之外的任何地方,您通常应该避免直接使用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'
}

答案 3 :(得分:1)

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

在会话中存储密码是明智还是必要,可能不是。也许是因为缓存的原因,但即便如此,它也很有趣。

相关问题