php - 使用持久登录 Cookie 时,如何根据数据库中的 bcrypt-hashed token 检查 Cookie token ?

标签 php mysql cookies authentication bcrypt

在持久登录 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_salthashed_token

当验证“记住我”登录 cookie(应该由 useridtoken 组成)时,您将需要迭代该 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/

相关文章:

php - Codeigniter 数据库连接错误

php - 更改我的帐户页面内的 woocommerce 订阅 "shop"链接

php - 如何通过 jquery ajax 发送多行文本

php - 使用事件记录或mysql从codeigniter中的多个表构造json

reactjs - 浏览器无法使用 fetch api 读取和发送 cookie,甚至无法将凭据设置为包含在跨源请求中

javascript - 为网络本地存储数据的最佳实践

PHP 上传问题获取错误 0 但 move_uploaded_file() 返回 false

MySQL 查询选择具有日期范围内的值的所有行

asp.net - Set-cookie 间歇性地不被遵守

php - mysql_insert_id() 0,但插入成功