散列“记住我”cookie令牌的最佳方法

时间:2011-12-14 10:31:11

标签: php cookies hash remember-me bcrypt

我正在尝试按照此处提供的指南实施“记住我”功能:The definitive guide to form-based website authentication,此处:http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/

当存储在数据库中时,应该对“cookie令牌”进行哈希处理(如果攻击者可以访问数据库,则未使用的令牌看起来像普通的登录/密码,允许登录网站)。

寻找一个好的哈希算法,我发现这个推荐的技术使用 bcrypt https://stackoverflow.com/a/6337021/488666

我已经尝试过,发现随着建议的轮数(15)导致非常缓慢的处理时间(在英特尔酷睿2双核处理器上散列2,3s +验证2,3s) E8500 + 4 GB RAM)

我知道哈希算法在阻碍攻击者方面应该相对较慢,但在这个级别上,它会妨碍用户使用该网站:)

你认为减少轮数(例如7,将处理时间减少到10ms + 10ms)就足够了吗?

1 个答案:

答案 0 :(得分:14)

引用The definitive guide to form-based website authentication

  

请勿在您的数据库中存储持续登录的COOKIE(令牌),   只有它的哈希!登录令牌是密码等效,所以如果一个   攻击者抓住你的数据库,他可以使用令牌   登录任何帐户,就像它们是明文登录密码一样   组合。 因此,使用强盐水散列(bcrypt / phpass)   存储持久性登录令牌时

我同意第一个粗体句,但不是最后一句。

如果我没有弄错的话,“强盐水哈希”算法的目的是有人不应该在给出彩虹表的情况下检索密码

但是在这里,哈希字符串不是密码,而是随机字符串。因此,任何彩虹表都不可能检索任何原始散列的字符串。我甚至猜测我可以使用基本的hash('sha256', $randomString)调用,目标是在数据库和cookie中为令牌设置不同的值。