假设我为每个用户存储一个随机的盐值。当用户更改密码时,我是否必须生成一个新的盐值,还是可以在整个用户帐户的生命周期内使用相同的值?
您应该更改盐值。盐值的设计目的是对所有密码实例尽可能保持唯一。
如果您为旧密码和新密码使用相同的盐值,则能够看到旧密码和新密码的攻击者可以以少于两倍攻击一个密码所需成本的代价攻击两个密码。这正是盐的设计要避免的情况(而盐没有其他用途)。
当然,由于旧密码已经过时,不能再用于进入您的系统,但由于用户倾向于重复使用密码,从攻击者的角度来看,旧密码仍然可能具有价值。特别是,当用户再次更改密码时,他可能会重新使用那个旧密码(这是大多数用户在面对需要定期更改密码的系统时做的事情:他们在两个密码之间交替使用)。