我一直在寻找创建密码盐的首选位置。
对我而言,在数据库级别创建密码salt并在数据库级别对输入的密码+ salt进行散列是有意义的。
但由于我是登录安全的超级菜鸟,我想知道哪个位置最适合创建盐本身。
根据我的阅读,我创建了一个存储过程,它接受userlogin
和password
并比较存储的盐连接以验证输入的密码是否正确。
我现在需要知道的是,在新用户帐户上应该在哪里创建密码盐?
如果用户忘了,我的意图是拥有不可退款的密码。如果他们忘了它给他们一个临时,然后需要改变。同样,如果密码更改,我也想相应地更改盐。
我没有完全安全的幻想,只想减轻机会。
答案 0 :(得分:2)
生成salt和散列密码的地方应该在代码中,而不是在数据库中。
要散列密码,您需要一个缓慢的密钥派生函数,如BCrypt或PBKDF2,但大多数数据库都没有此类函数的实现。这些函数具有成本因子,它控制计算哈希值所需的时间(对强制执行的安全性越强)。 salt和cost因子通常存储在与password-hash相同的字符串中,因此您只需要一个字段来存储哈希值。
要验证密码,首先必须使用password-hash的用户名进行搜索,然后该函数可以提取已用盐和成本因子,最后输入的密码可以使用相同的参数进行哈希处理以进行比较。
在代码中执行此操作还有另一个原因,密码系统必须切换到更强大的算法,或者必须在将来增加成本因素,然后在SQL语句中处理代码的向后兼容性要容易得多。