哈希和; Salting - 使用/ cookies验证登录

时间:2011-01-04 22:48:19

标签: php authentication cookies hash salt

所以这基本上是一种保证,就哈希/腌制而言,我正在进行整个注册/登录过程。

我有一个用户表,其中包含字段password,salt,token(显然还有其他人,但这是最重要的)。注册后,它会生成一个随机盐和一个随机令牌,并在密码字段中输入:

hash("sha256", $theirpostpassword.$randomgeneratedsalt);

随机生成的salt和令牌存储在表中用户行的各自字段中。

因此,在登录时,我只使用他们指定的用户名从用户行中选择salt。然后我做了一个计数查询,查看有多少行将他们的帖子密码与他们的特定盐连接起来,然后我将它们登录。很确定我把那部分放下了。

现在我正在考虑在每个页面上验证他们的登录信息我会在每个检查其cookie的页面上运行一个函数,以查看id-username-token的格式是否与数据库中的行匹配。这意味着每次登录都会使用这些凭据设置其cookie。

现在我能想到的唯一能让它变得更好的是每次有效登录都会更改令牌吗?

感谢有识之士。

3 个答案:

答案 0 :(得分:4)

是的,你绝对应该在每次登录时更改令牌。否则,被盗一次的令牌是一个永远被盗的账户。用户希望注销通过使cookie或其他数据无效来保护会话免受攻击。

而不是令牌是随机的,你可以通过从用户ID的哈希值,会话到期时间以及你想要的其他任何内容,加上一个盐(就像登录系统)。这种盐不一定来自数据库,但它可以。它可能是一个硬编码的字符串(我认为有时称为“胡椒”)。如果cookie超过了到期时间,请记住将其视为无效。这就是令牌应该是签名的原因,以确保它们不会欺骗那些数据。

答案 1 :(得分:2)

对我来说听起来不错,但你应该知道几件事情:

要使您的密码数据库能够抵御暴力攻击,您可以迭代哈希:

$hash = $password;
for ($i = 0; $i < 1000; ++$i) {
    $hash = hash("sha256", $hash . $salt);
}

其次,请确保始终使用SSL。没有它,攻击者窃取登录cookie是非常微不足道的。请参阅firesheep,了解它是多么微不足道的一个很好的例子。

每次登录时都要更改令牌,并考虑为每个请求更改令牌,以防止会话固定和重播攻击。

您还可以从数据库中选择salt和hash,并在服务器端(而不是在DB上)执行哈希比较,以减少到数据库的往返次数。

我建议令牌完全随机。你希望它是不可思议的,最好的方法是随机的。您可以将令牌绑定到特定的IP地址,但这应该是随机令牌的补充,而不是替换。

这就是我想到的一切。擅长寻求建议,而不仅仅是MD5密码并将其粘贴在数据库中!

答案 2 :(得分:1)

  

检查他们的cookie,看看id-username-token的格式是否与数据库中的行相匹配

你可以,但这是相当昂贵的,你没有解决会话管理的问题 - 过去设置cookie到期时间并不总是导致cookie被删除。无论如何,请考虑这一点来记住我的函数类型(但是使用偏移路径来避免每次都出现cookie)。

您没有在会话中存储经过身份验证的用户名。但是,在对用户进行身份验证时,请更改会话ID,并使用SSL来传递身份验证令牌。