我是Web开发和数据库的新手,我正在尝试以合理的安全性和速度实现密码身份验证。我已经读过关于散列密码并为每个用户附加一个独特的盐,以阻止人们生成彩虹表。
我的问题涉及我必须搜索以验证用户的时间。由于我不知道谁在任何给定的时间尝试连接,在我看来,我需要从盐列中检索每个字段然后散列提交的密码+每个独特的盐,然后最终比较每个输出到散列表中的字符串?
所以我必须为hash(密码+ salt)的每个组合提交一个单独的查询?这似乎非常缓慢。我错过了一个可以加快这个过程的技巧吗?或者只是吮吸它并牺牲速度以获得更好的安全性?或者我错了,而且今天的计算机的速度根本不是问题?
答案 0 :(得分:1)
您无法仅根据密码对用户进行身份验证。密码是用户是他们所说的人的验证,因此您需要某种用户标识符 - 名称或其他。然后表格显示为users(..., name, password, ...)
,您执行SELECT password WHERE name = "foo"
并从那里继续进行验证。方便的形式是保持在密码字段内生成派生密钥所需的所有参数,例如,像这样:
algo$salt$password hash
对于散列本身,你不希望它快 - 看看关键的派生函数,如PBKDF2,bcrypt或scrypt。一般来说,调整参数以便大约需要一秒钟来获得一个键是一种很好的方法,可以使暴力破坏变得不可行。