2012-04-14 60 views
0

我是网络开发和数据库的新手,并试图以合理的安全性和速度实施密码身份验证。我已阅读了有关哈希密码并追加了每个用户独有的盐,以阻止人们生成彩虹表。搜索数据库所花费的时间

我的问题涉及我必须搜索以验证用户的时间。由于我不知道谁在任何时候尝试连接,因此在我看来,我需要从salt列中检索每个字段,然后对提交的密码和每个独特的盐进行散列,然后最后将每个输出与散列进行比较表中的字符串?

所以我必须提交散列(密码+盐)的每个组合的单独查询?这看起来会非常缓慢。我错过了一个可以加速这个过程的技巧吗?还是仅仅是为了提高安全性而牺牲速度?或者我误以为今天的电脑速度并不是问题?

回答

1

您不能仅基于密码对用户进行身份验证。密码是验证用户是谁,他们说他们是谁,所以你需要某种用户标识符 - 名称或其他。表然后看起来像users(..., name, password, ...),你做SELECT password WHERE name = "foo"并从那里继续验证。便利的形式是保持在密码字段内生成派生密钥所需的所有参数,例如,像这样:

algo$salt$password hash 

对于散列本身,你不希望它是快 - 看到像PBKDF2,bcrypt或scrypt密钥导出函数。一般来说,调整这些参数以便获取一个关键字需要一秒左右的时间,这是使暴力强制成为不可行的一个好方法。

+0

哇我是个白痴。我不敢相信我没有想过要在名称列中搜索匹配的字符串,而不是将该用户的密码与盐进行比较。在我的辩护中,现在是凌晨3点半,我现在在哪里哈哈。谢谢。 – StackAttack 2012-04-14 07:24:33

相关问题