所以我在用password_hash()(php 5.5+)进行哈希处理后将用户密码存储在数据库中。 然后使用password_verify()登录时验证用户。但现在我想用cookie存储用户浏览器的密码。我使用password_hash散列相同的密码,但这次散列的第二部分明显不同。 (盐)
因此,两个哈希值(数据库中的一个哈希值和cookie中的哈希值)不相等。我怎么验证他们呢?
答案 0 :(得分:3)
您要做的是重新创建会话。我建议你只使用一个会话。
如果由于某种原因你不能,那么生成一个随机字符串(使用像random_compat
这样的库)。
$token = random_bytes(16);
将字符串存储在数据库中:
INSERT INTO user_to_token (user_id, token) VALUES (?, ?)
但是,存储哈希值,以便在数据库泄漏时,攻击者不会知道原始令牌,因此无法窃取会话。
$query->execute([$userId, hash('sha256', $token)]);
然后,将cookie设置为原始值base64 encoded:
set_cookie("token", base64_encode($token));
现在,验证,解码然后散列:
$token = hash('sha256', base64_decode($cookie));
然后从DB中查找用户ID:
SELECT user_id FROM user_to_token WHERE token = ?
你已经完成了。
答案 1 :(得分:0)
在cookie上存储用户凭证存在高风险。
如果您在数据库中存储哈希密码,那么您只需要传递用户名和密码,然后将从其他文件中哈希并将其与您的数据库匹配。
离。的login.php 发布用户名和密码
usercheck.php md5(密码)并将其检入已经哈希密码的数据库