6

这个流行的持久登录 Cookie 解决方案中,涉及生成一个随机的 128 位“令牌”以保存在用户的 Cookie 中,Jens Roland 建议:

并且不要将持久登录 COOKIE(令牌)存储在您的数据库中,只存储它的哈希值!登录令牌是密码等效的,因此如果攻击者掌握了您的数据库,他/她可以使用这些令牌登录到任何帐户,就像它们是明文登录密码组合一样。因此,在存储持久登录令牌时使用强加盐哈希(bcrypt / phpass)。

但是,当 bcrypting Cookie Token 总是会产生不同的结果(因为 bcrypting 总是使用随机盐)时,如何检查 Cookie Token 与 DB 中的 bcrypted Token 以确认 Cookie 登录是有效的?

换句话说,您不能只对 Cookie 令牌进行 bcrypt 并在数据库中查找匹配项,因为您永远找不到匹配项,那么您如何根据推荐的解决方案将其与数据库中的散列版本进行实际匹配(“The服务器保留一个数字->用户名关联表,查找该表以验证 cookie 的有效性。”)?

编辑:

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

4

1 回答 1

1

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

在验证“记住我”登录 cookie(应由userid和组成token)时,您需要遍历该用户 ID 的每个令牌条目(通常只有一个条目,永远不会超过少数)并使用存储随机盐:

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

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

于 2013-04-05T12:15:23.193 回答