- 服务端最终裁决:任何前端逻辑、文件或网络请求都可被绕过。
- 不记录密码:日志、异常、埋点、Sentry、APM、审计事件中都不能出现密码、完整 SHA-1 或 HIBP 响应明细。
- 不
trim():空格可以是合法密码字符;规范化使用 NFC,不擅自改大小写。 - 整串匹配:本地名单与上下文候选按完整值比较。不要因为密码“包含某个短词”就拒绝,否则误报会很高。
- HIBP 不逐键调用:仅在提交或失焦后查询;设置超时、熔断和故障策略。
- 加密传输:前端 API 与注册接口必须使用 HTTPS;CSP、依赖完整性和供应链控制仍需单独落实。
- 安全存储:推荐 Argon2id。SHA-1 仅用于 HIBP 索引查询,不能替代密码 KDF。
- 不要定期强制轮换:除非有泄露证据、用户请求或风险事件。
示例默认 ALLOW_WITH_LOCAL_CHECKS:HIBP 暂时不可用时,依赖本地名单、上下文和强度评分继续处理,并记录不含敏感信息的服务可用性指标。高保证系统可以改为 REJECT,但要评估外部服务故障导致注册/改密全部不可用的风险。
- 固定 release 构建,避免上游浮动分支被无审查地带入生产。
- 更新时比较条数、SHA-256、文件大小和样本命中率。
- 不直接自动发布上游变更;先走代码审查、许可证审查和回归测试。
- 静态名单不是“永远最新”。动态泄露覆盖依赖 HIBP API 或定期离线下载。
拒绝时只给通用原因,例如“该密码过于常见或已出现在泄露数据中,请换一个更长且不易猜到的密码”。不要告诉用户具体命中了哪个内部名单,也不要回显密码。