You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否应为数据库中的哈希密码列添加唯一约束?

密码哈希存储是否应添加唯一约束?

我一直习惯不为数据库中存储的哈希密码添加唯一约束,但最近开始困惑:为什么这种做法会被视为糟糕的选择?假设我使用的是安全的哈希算法与随机盐,密码存储分为两种形式:

  • 单列存储:格式为alg.passwordhash.salt
  • 多列存储:分为alg、passwordhash、salt三列
    其中哈希值长度为512位,盐长度为128位。

关于碰撞概率的分析

最坏情况是所有用户使用相同密码,此时随机盐会将有效加密强度限制在128位——虽然这比512位弱,但UUID同样是128位,碰撞概率极低,和需要唯一标识的会话令牌场景类似。

可行的约束方案

我可以为密码添加唯一约束:

  • 单列设计时,直接对该列设置唯一约束
  • 三列设计时,分别对passwordhash列和salt列设置唯一约束

两种场景的验证

意外碰撞场景

意外触发约束的概率极低,若真发生这种情况,只需在应用层循环生成新盐并重新哈希即可,通常2-3次尝试就能解决问题。

故意违规场景

比如攻击者通过SQL注入获取数据库权限,将其他账户的哈希与盐覆盖为自己的,从而能用自身密码登录其他账户。唯一约束能阻止这种批量修改操作,虽然无法完全防范攻击,但会大幅提升攻击的难度与耗时。

综上,我认为添加唯一约束仅需少量额外开发工作,还能提供一定的安全提升,并非不可行。我的推理是否存在疏漏?

内容的提问来源于stack exchange,提问作者Skru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 00:18:14