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

密码历史存储系统设计:防止密码复用与相似密码问题

无明文存储下的密码相似性检测方案

针对你需要的「禁止复用近期密码+检测密码相似性」需求,以下是几种无需存储明文密码的可行方案,按实现复杂度和适用性排序:

1. 客户端侧特征校验+服务器特征哈希存储(最易实现)

这是中小型项目最推荐的方案,核心是把大部分相似性判断放在客户端做,服务器只存不会泄露明文的特征哈希:

  • 客户端临时处理:用户输入新密码时,让用户同时输入当前旧密码(仅在本地临时使用,绝不上传服务器)。客户端直接做简单相似性判断:
    • 检查新密码是否仅在旧密码末尾/开头追加了数字、符号(比如旧密码是MyPass123,新密码是MyPass123!或123MyPass)
    • 检查新密码和旧密码的编辑距离是否小于阈值(比如允许最多1个字符修改,用简化版Levenshtein距离实现,只统计末尾/开头的增减)
  • 服务器侧存储:用户每次修改密码时,客户端提取旧密码的核心特征(比如去掉所有末尾的数字/符号后取前8位、或者提取密码的2-gram组合哈希),对特征做加密哈希(比如SHA-256)后上传服务器,服务器把这个哈希和用户的旧密码哈希集合存在一起。下次用户修改密码时,客户端对新密码做同样的特征提取和哈希,发送给服务器对比,如果匹配上就拒绝。
  • 优缺点:几乎没有服务器性能开销,隐私性强;但需要覆盖足够多的常见相似场景,可能存在少量漏判,需要根据用户行为调优特征规则。

2. 模糊承诺(Fuzzy Commitment)方案(准确且安全)

如果需要更准确的相似性判断,模糊承诺是隐私友好的选择:

  • 原理:把密码的哈希和一个容错范围绑定,服务器存储这个绑定后的"承诺",客户端用新密码生成的承诺去匹配,判断是否在允许的相似范围内。
  • 实现步骤:
    1. 用户第一次设置密码时,客户端计算密码的SHA-256哈希,同时设定一个容错值(比如允许最多2个字符的修改),把哈希和容错值加密后存在服务器。
    2. 用户修改密码时,客户端计算新密码的SHA-256哈希,发送给服务器。
    3. 服务器在加密状态下对比两个哈希的容错匹配度(比如用汉明距离判断),如果在允许范围内就拒绝修改。
  • 优缺点:能准确识别字符修改、增减等相似场景,完全不会泄露明文;但需要实现加密状态下的哈希比对,技术复杂度比第一种高。

3. 相似哈希(SimHash)变种方案(平衡复杂度与准确性)

SimHash的特点是相似输入会生成相似的哈希值,适合快速判断密码相似性:

  • 实现步骤:
    1. 用户设置密码时,客户端计算密码的SimHash值(把密码拆成字符n-gram,生成权重向量后计算哈希),然后对SimHash值再做一次SHA-256加密,存在服务器。
    2. 用户修改密码时,客户端计算新密码的SimHash并加密,发送给服务器。
    3. 服务器解密两个SimHash值,计算它们的汉明距离,如果距离小于设定阈值(比如3),说明密码相似,拒绝修改。
  • 注意:SimHash本身不是加密哈希,必须二次加密存储,防止攻击者通过SimHash反推密码特征;另外要注意调整阈值,避免误判(比如用户只是换了大小写,要不要算作相似)。
  • 优缺点:实现难度中等,能快速批量判断相似性;但对密码的结构变化(比如字符顺序调换)不敏感,可能漏判这类相似场景。

补充:密码复用检测的强化

你提到的哈希存储检测复用,这里再提两个关键点:

  • 每个用户用独立的盐值和密码一起哈希,避免彩虹表攻击。
  • 存储最近3-5个密码的哈希,覆盖用户复用近期密码的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:11:14