移除密码自定义盐值的安全方案咨询:无需新增字段可行吗?
你的方案分析与安全风险
首先,先指出代码里的语法错误:两个bcrypt.compareSync调用的括号都未闭合,需要补上)才能正常运行。
接下来回答你的核心问题:这段代码不会给攻击者“两次猜测密码的机会”——攻击者每次请求只能输入一个密码,系统只是用这个密码先后做两种哈希校验(先加自定义盐对比旧哈希,再用原密码对比新哈希),并不是允许他们输入两个不同的密码尝试。
但这段代码确实存在几个需要注意的安全问题:
- 时序攻击风险:两次
compareSync的执行时长可能存在差异,攻击者可以通过响应时间判断该用户的密码是旧格式(需要走第一个校验分支)还是新格式(直接走第二个分支)。虽然这个风险不算致命,但会暴露用户密码的格式状态,存在被利用的可能。 - 逻辑冗余与极低概率碰撞:理论上存在极低概率,某个密码加自定义盐后的哈希刚好和无盐的bcrypt哈希一致(碰撞),这时候会触发旧密码更新逻辑,但实际中几乎不可能发生,影响可以忽略。
另外,有个优化建议:调换校验顺序——先尝试无自定义盐的bcrypt校验,失败后再尝试加自定义盐的校验。这样大部分已更新密码的用户只需要一次校验,减少不必要的计算,也能降低时序攻击的影响(只有旧用户才会走到第二次校验)。
你不想新增isPasswordSalted字段的想法是合理的,这种临时兼容逻辑确实没必要额外加字段,只要注意上述风险即可。
内容的提问来源于stack exchange,提问作者Architek
相关产品推荐
相关产品推荐

