在会话中存储密码是不是安全? [复制]
Posted
技术标签:
【中文标题】在会话中存储密码是不是安全? [复制]【英文标题】:Is it secure to store a password in a session? [duplicate]在会话中存储密码是否安全? [复制] 【发布时间】:2013-11-04 19:53:58 【问题描述】:我需要在会话中经常使用密码。我正在使用由密码加密的密钥加密我的用户数据。所以有我的问题。在 php 会话中存储 plaintext 密码是否安全(不是 cookie,所以非客户端)?有没有更好的办法?还是我应该每次都向我的用户询问密码?
我使用 phpseclib 使用用户密码加密 rsa 的私钥。每次我想访问密钥时,我都需要密码。我有两个选择:要么我存储密码,要么存储我认为两者都不太好的密钥。我不能使用密码哈希进行加密,因为哈希存储在数据库中的“明文”中......
【问题讨论】:
会话存储在服务器上,您只需在浏览器中获取会话 ID 的 cookie 就个人而言,我不认为存储在任何地方的明文密码是安全的。 也许用密码哈希加密? 您可以这样存储密码。浏览器无法访问会话! 唯一存储在客户端的是会话密钥,它可以通过 cookie 或 GET 参数传播。 【参考方案1】:在任何地方以任何容量保存明文密码通常是个坏主意。会话本身是安全的,但仅与服务器环境的其余部分一样安全。管理员或其他合法和恶意用户都可以访问存储在其中的数据。如果可以避免,您永远不想处理客户的秘密;这也意味着您希望避免在任何情况下看到用户的密码,并且您应该以纯文本密码在技术上尽可能短的方式构建代码。
如果您需要在会话期间为某事使用密码,您应该构建您的应用程序,使其从不使用明文密码,而是使用key derivation function 来从密码中获取密钥然后您将其用于敏感任务。这样一来,泄露用户密码的机会就会少得多。请记住,用户拥有的唯一安全性是他的密码的机密性,只有他应该知道。
【讨论】:
是的。您可以选择将派生密钥存储在会话中,知道如果服务器受到威胁,它可能会受到威胁,但至少用户的密码仍然是安全的。这样一来,对于在其他地方使用相同密码的用户来说,您的安全故障不会成为更大的问题。【参考方案2】:如果这样做并且当黑客访问您的服务器时,他们将看到纯文本密码。永远不要存储纯文本密码(在任何地方)
关于一般问题。您向用户询问一次密码并根据存储的加密密码验证加密密码 - 假设在数据库中。如果它们相同,那么您将开始一个新会话。当用户下次尝试访问您的站点时,您将检查该用户的会话是否存在。所以没有必要在会话中存储密码。
【讨论】:
当黑客访问你的服务器时,我不认为 PHP 会话数据是他可能首先读取的...如果他在服务器上,他可以检索很多东西! @JoDev 很多东西,是的。但不是普通用户密码 是的,不是直接的,但是这个密码很可能是存储在像mysql这样的SQL数据库中的……所以他可以直接从源头读取所有密码! (当我们有能力破解服务器时,您可以打开 MySQL...) @JoDev 希望黑客不会寻找会话数据有点幼稚:) @JoDev 不,只是它们的哈希值是可见的(你明白吗?)【参考方案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】:切勿以明文形式存储密码。除此之外:是的,会话是安全的。会话存储在服务器上。会话数据本身永远不会发送到浏览器。
在会话中存储密码是否明智甚至必要,可能不是。也许是出于缓存的原因,但即便如此,它还是很脆弱。
【讨论】:
+1 到 balance.coz 没有什么可否决的 编辑了取消投票的答案。 :) 嗯,起初并不清楚 OP 是否打算以明文形式存储密码 - 这太荒谬了,我错过了。 是的,我想说的是,就在答案被冻结之前 ^^ +1 也以上是关于在会话中存储密码是不是安全? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
这对于用户登录和验证是不是足够安全? (PHP、MySQL、会话)
将敏感数据存储在本地存储或会话存储中是不是安全? Localstorage 允许对敏感数据进行任何攻击