2015-10-05 160 views
0

因此,我通过password_hash()(php 5.5+)将哈希后的用户密码存储在数据库中。 ,然后在使用password_verify()登录时验证用户。但现在我想用cookie保存用户浏览器的密码。我使用password_hash散列相同的密码,但这次散列的第二部分明显不同。 (盐)将password_hash生成的两个哈希值作为一个密码进行比较

因此,两个散列(数据库中的一个和cookie中的一个)不相等。我如何验证他们呢?

+5

*“但是现在我想用cookies保存用户浏览器的密码。”* - ***不要。***另外,我确定要知道哪个网站是我的,所以我将不会在那里注册。 –

+0

那我该如何使用cookies登录用户呢? – VSG24

+0

阅读关于php的会话 – Federkun

回答

0

在cookie上存储用户凭证是高风险的。

如果你在数据库中存储哈希密码,所以你只需要传递用户名和密码,然后将其他文件哈希值并将其匹配到数据库中。

ex。 login.php中 后的用户名和密码

usercheck.php MD5(密码),并检查到数据库,已经哈希密码

+0

不建议使用md5进行密码散列:它太不安全,您最好建议以明文形式存储它。 OP已经在使用更安全的password_hash()/ password_verify() –

+0

我不建议使用md5。只是例子...他可以使用许多加密在PHP ... –

+0

@MarkBaker怎么样'md5($字符串)+ $盐'组合?也可以认为这是不安全的? – Yang

3

不存储在客户端密码

你是什么试图做的是重新创建会话。我建议你只是使用一个会话。

如果你不能出于任何原因,然后生成一个随机字符串(使用像random_compat库)。

$token = random_bytes(16); 

字符串存储在数据库中:

INSERT INTO user_to_token (user_id, token) VALUES (?, ?) 

然而,存储哈希因此,如果你的数据库泄漏,攻击者也不会知道原来的记号,因此将无法窃取会话。

$query->execute([$userId, hash('sha256', $token)]); 

然后,设置cookie为原始值,base64编码:

set_cookie("token", base64_encode($token)); 

现在,验证,解码和再散列:

$token = hash('sha256', base64_decode($cookie)); 

然后查找用户ID来自DB:

SELECT user_id FROM user_to_token WHERE token = ? 

而你是完成了。