加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 如何在使用持久登录Cookie时检查数据库中的bcrypt-hashed

发布时间:2020-12-13 22:48:17 所属栏目:PHP教程 来源:网络整理
导读:在 this popular solution中,持久登录Cookie涉及生成随机的128位“令牌”以保存在用户的Cookie中,Jens Roland建议: And DO NOT STORE THE PERSISTENT LOGIN COOKIE (TOKEN) IN YOUR DATABASE, ONLY A HASH OF IT! The login token is Password Equivalent,s
在 this popular solution中,持久登录Cookie涉及生成随机的128位“令牌”以保存在用户的Cookie中,Jens Roland建议:

And DO NOT STORE THE PERSISTENT LOGIN COOKIE (TOKEN) IN YOUR DATABASE,
ONLY A HASH OF IT!
The login token is Password Equivalent,so if an
attacker got his hands on your database,he/she could use the tokens
to log in to any account,just as if they were cleartext
login-password combinations. Therefore,use strong salted hashing
(bcrypt / phpass) when storing persistent login tokens.

但是,如何检查Cookie令牌与数据库中的加密令牌以确认Cookie登录是否有效,当bcrypting Cookie令牌总是会产生不同的结果(因为bcrypting总是使用随机盐)?

换句话说,你不能只是加密Cookie令牌并在数据库中查找匹配项,因为你永远找不到它,所以你如何根据recommended solution(“服务器”)将它与数据库中的哈希版本实际匹配?保留一个number->用户名关联表,查询该表以验证cookie的有效性.“)?

编辑:

请记住,根据上面链接的推荐解决方案,单个用户可以为不同的设备提供多个Cookie /令牌.我提到这是因为答案已经提交(已被删除),认为每个用户只有一个令牌.

解决方法

如前面的答案所述,bcrypt将随机盐存储为哈希的一部分,因此数据库中的每个令牌条目都将包含random_salt和hashed_token.

在验证“记住我”登录cookie(应该包含用户标识和令牌)时,您需要遍历该用户标识的每个标记条目(通常只有一个条目,永远不会超过一个条目)并分别检查每个条目使用存储的随机盐:

foreach (entry in stored_tokens_for_user) {
    if (entry.hashed_token == bcrypt(cookie.token,entry.random_salt))
        return true;
}
return false;

(如果您的数据库作为查询语法的一部分内置了对bcrypt的支持,您可以创建一个准备好的语句来为您执行此操作)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读