在持久登录 Cookie 的 this popular solution 中,它涉及生成一个随机的 128 位“ token ”以保存在用户的 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.
但是当 bcrypting Cookie token 总是会产生不同的结果(因为 bcrypting 总是使用随机盐)时,您如何检查 Cookie token 与数据库中的 bcrypted token 以确认 Cookie 登录有效?
换句话说,您不能只加密 Cookie token 并在数据库中查找匹配项,因为您永远找不到匹配项,那么您如何根据 recommended solution ( "服务器保留了一个数字-> 用户名关联表,查找该表以验证 cookie 的有效性。")?
编辑:
请记住,根据上面链接的推荐解决方案,单个用户可以为 不同 设备拥有多个 Cookie/ token 。我提到这是因为提交了一个答案(后来被删除了),假设每个用户只有一个 token 。
最佳答案
如前一个答案所述,bcrypt 将随机盐存储为散列的一部分,因此数据库中的每个 token 条目都将包含 random_salt
和 hashed_token
。
当验证“记住我”登录 cookie(应该由 userid
和 token
组成)时,您将需要迭代该 userid 的每个 token 条目(通常只有一个条目,绝不会超过一小部分)并使用存储的随机盐分别检查每个条目:
foreach (entry in stored_tokens_for_user) {
if (entry.hashed_token == bcrypt(cookie.token, entry.random_salt))
return true;
}
return false;
(如果您的数据库内置支持 bcrypt 作为查询语法的一部分,您可以创建一个准备好的语句来为您执行此操作)
关于php - 使用持久登录 Cookie 时,如何根据数据库中的 bcrypt-hashed token 检查 Cookie token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15685951/