0

我是 Web 开发和数据库的新手,正在尝试以合理的安全性和速度实现密码身份验证。我已经阅读了关于对密码进行哈希处理并为每个用户附加一个唯一的盐,以阻止人们生成彩虹表。

我的问题涉及我必须搜索以验证用户的时间。由于我不知道谁在任何给定时间尝试连接,在我看来,我需要从 salt 列中检索每个字段,然后对提交的密码 + 每个唯一的 salt 进行哈希处理,然后最后将每个输出与哈希值进行比较表中的字符串?

所以我必须为哈希(密码+盐)的每个组合提交一个单独的查询?这似乎会非常缓慢。我错过了一个可以加快进程的技巧吗?或者它只是为了更好的安全性而牺牲它的速度?还是我弄错了,以当今计算机的速度,这根本不是问题?

4

1 回答 1

1

您不能仅根据密码对用户进行身份验证。密码是对用户身份的验证,因此您需要某种用户标识符——姓名或其他任何东西。然后表格看起来像users(..., name, password, ...),您SELECT password WHERE name = "foo"从那里开始并继续进行验证。方便的形式是将生成派生密钥所需的所有参数保留在密码字段内,例如:

algo$salt$password hash

对于散列本身,您不希望它很快 - 请参阅 PBKDF2、bcrypt 或 scrypt 等密钥派生函数。通常,调整参数以使导出一个密钥大约需要一秒钟是使暴力破解不可行的好方法。

于 2012-04-14T07:00:52.337 回答