6

我正在尝试实现“记住我”功能,遵循此处提供的指南:基于表单的网站身份验证的权威指南,以及此处: http: //fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/

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

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

我已经尝试过了,发现建议的轮数 (15) 会导致处理时间非常慢(哈希 2,3s + 在 Intel Core 2 Duo E8500 + 4 GB RAM 上验证 2,3s)

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

您认为更少的轮次(例如 7 轮,将处理时间降低到 10 毫秒 + 10 毫秒)就足够了吗?

4

1 回答 1

14

引用基于表单的网站身份验证的权威指南

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

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

如果我没记错的话,“强加盐散列”算法的目的是让某人无法在给定彩虹表的情况下检索密码。

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

于 2011-12-14T16:42:58.943 回答