我知道我们用来加密密码的盐应该是:
它们是通过算法从与用户相关联的一些数据中生成的,例如,用户的时间戳 已创建
它们是随机生成并以某种形式存储的
它们是纯文本或双向加密以及用户的密码记录
由于第一点,当任何人访问db时,为另一个用户设置他的密码时,他不能代替另一个用户登录。 但是当我使用BCryptPasswordEncoder时,我在另一个用户的“密码”列中替换了我的密码,并且可以由该用户登录。
我认为这是一个安全问题,因为有权访问数据库的管理员可以登录而不是任何用户登录,并且可能会做一些工作。这些作品是由该用户而非管理员用户记录的。
如果我们使用userId
或userCreationTime
或类似的东西生成盐和覆盖
PasswordEncoder#match
方法,问题已解决。
如果这些观点是正确的,我的问题是: 如何在BCryptPasswordEncoder中使用自定义盐生成器?
答案 0 :(得分:3)
Salt旨在防止针对泄漏的哈希密码的rainbow table攻击。通过良好的按用户分配,一个彩虹表将无法用于整个数据库,并且攻击者需要为每个用户生成一个彩虹表。这与计算复杂的哈希算法结合在一起,使得从泄漏的哈希密码数据库中反向工程密码变得不切实际。
但是,如果有人可以操纵数据库,那么您就是pwnz0r3d。如果管理员可以修改数据库,则他们可以修改用户创建时间。他们还可以用已知值“交换”用户ID。