我正在尝试按照此处提供的指南实施“记住我”功能: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)就足够了吗?
答案 0 :(得分:14)
引用The definitive guide to form-based website authentication:
请勿在您的数据库中存储持续登录的COOKIE(令牌), 只有它的哈希!登录令牌是密码等效,所以如果一个 攻击者抓住你的数据库,他可以使用令牌 登录任何帐户,就像它们是明文登录密码一样 组合。 因此,使用强盐水散列(bcrypt / phpass) 存储持久性登录令牌时。
我同意第一个粗体句,但不是最后一句。
如果我没有弄错的话,“强盐水哈希”算法的目的是有人不应该在给出彩虹表的情况下检索密码。
但是在这里,哈希字符串不是密码,而是随机字符串。因此,任何彩虹表都不可能检索任何原始散列的字符串。我甚至猜测我可以使用基本的hash('sha256', $randomString)
调用,目标是在数据库和cookie中为令牌设置不同的值。