In 这个流行的解决方案 https://stackoverflow.com/a/477578/869849对于涉及生成随机 128 位“令牌”以保存在用户 Cookie 中的持久登录 Cookie,Jens Roland 建议:
And 不要将持久登录 Cookie(令牌)存储在您的数据库中,
只是它的一个散列!登录令牌与密码等效,因此如果
攻击者获得了您的数据库,他/她可以使用令牌
登录任何帐户,就像它们是明文一样
登录密码组合。因此,使用强加盐哈希
(bcrypt / phpass) 存储持久登录令牌时。
但是,当 bcrypting Cookie Token 总是会产生不同的结果(因为 bcrypting 总是使用随机盐)时,如何对照数据库中的 bcrypted Token 检查 Cookie Token 以确认 Cookie 登录是否有效?
换句话说,您不能只是对 Cookie 令牌进行加密并在数据库中查找匹配项,因为您永远找不到匹配项,那么如何根据数据库中的散列版本实际将其匹配推荐解决方案 http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/(“服务器保存一个数字->用户名关联表,查找该表以验证 cookie 的有效性。”)?
Edit:
请记住,根据上面链接的推荐解决方案,单个用户可以拥有multipleCookie/令牌用于不同的设备。我提到这一点是因为提交的答案(已被删除)假设每个用户只有一个令牌。
正如前面的答案中提到的,bcrypt 将随机盐存储为哈希的一部分,因此数据库中的每个令牌条目都将包含两者random_salt
and hashed_token
.
验证“记住我”登录 cookie 时(应包含userid
and token
),您将需要迭代该用户 ID 的每个令牌条目(通常只有一个条目,绝不会超过几个),并使用存储的随机盐分别检查每个条目:
foreach (entry in stored_tokens_for_user) {
if (entry.hashed_token == bcrypt(cookie.token, entry.random_salt))
return true;
}
return false;
(如果您的数据库内置支持 bcrypt 作为查询语法的一部分,您可以创建一个准备好的语句来为您执行此操作)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)