我需要在会话中经常使用密码。我正在使用由密码加密的密钥加密我的用户数据。所以有我的问题。在 php 会话中存储纯文本密码是否安全(不是 cookie,所以非客户端)?有没有更好的办法?还是我应该每次都向我的用户询问密码?
我使用 phpseclib 使用用户密码加密 rsa 的私钥。每次我想访问密钥时,我都需要密码。我有两个选择:要么存储密码,要么存储我认为两者都不太好的密钥。我不能使用密码哈希进行加密,因为哈希存储在数据库中的“明文”中......
我需要在会话中经常使用密码。我正在使用由密码加密的密钥加密我的用户数据。所以有我的问题。在 php 会话中存储纯文本密码是否安全(不是 cookie,所以非客户端)?有没有更好的办法?还是我应该每次都向我的用户询问密码?
我使用 phpseclib 使用用户密码加密 rsa 的私钥。每次我想访问密钥时,我都需要密码。我有两个选择:要么存储密码,要么存储我认为两者都不太好的密钥。我不能使用密码哈希进行加密,因为哈希存储在数据库中的“明文”中......
在任何地方以任何容量保存明文密码通常是一个坏主意。会话本身是安全的,但仅与服务器环境的其余部分一样安全。管理员或其他合法和恶意用户都可以访问存储在其中的数据。如果可以避免,您永远不想处理客户的秘密;这也意味着您希望避免在任何情况下看到用户的密码,并且您应该以纯文本密码在技术上尽可能短的方式构建代码。
如果您需要在会话期间为某事使用密码,您应该构建您的应用程序,使其从不使用明文密码,而是使用密钥派生函数从密码中派生密钥,然后将其用于敏感任务。这样,暴露用户密码的机会就会少得多。请记住,用户拥有的唯一安全性是只有他应该知道的密码的机密性。
如果这样做并且当黑客访问您的服务器时,他们将看到纯文本密码。永远不要存储纯文本密码(在任何地方)
关于一般问题。您向用户询问一次密码并根据存储的加密密码验证加密密码 - 假设在数据库中。如果它们相同,那么您将开始一个新会话。当用户下次尝试访问您的站点时,您将检查该用户的会话是否存在。因此无需在会话中存储密码。
永远不要在任何地方存储任何类型的敏感数据,除了您通常应该避免直接使用的数据库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'
}
永远不要以明文形式存储密码。除此之外:是的,会话是安全的。会话存储在服务器上。会话数据本身永远不会发送到浏览器。
在会话中存储密码是否明智甚至必要,可能不是。也许是出于缓存的原因,但即便如此,它还是很脆弱。