密码策略有多有效?

密码策略有多有效?

许多常见的密码规则给用户带来不便,却无法阻止现代攻击。了解 NIST、NCSC 和 Microsoft 现行指南支持哪些安全措施。

密码策略常被当作一份检查清单:必须包含大写字母、数字和符号,并且每隔 60 或 90 天更换一次。这些规则直观可见,也容易审计,但看得见并不等于有效。攻击者利用的是人们选择密码时的可预测习惯、重复使用的凭据、薄弱的账户恢复流程,以及保护不力的密码数据库。

实用的密码策略应当降低这些具体风险,同时保持足够的易用性,避免用户设法绕过规则。

最低长度

增加长度可以扩大搜索空间,但前提是密码不是常见短语或可预测的模式。NIST 现行指南要求:当密码是唯一的身份验证因素时,长度至少为 15 个字符;当密码用于多因素身份验证时,最低长度可以降至八个字符。系统应至少允许 64 个字符的密码,以便正常使用密码管理器和密码短语。

长度只是基本要求,并不能证明密码足够强。还需要使用已泄露密码黑名单,因为即使密码很长,只要攻击者已经知道它,就仍然不安全。

定期密码过期

按固定周期强制更改密码,往往只会让用户做出微小且可预测的修改。这也让每位用户都付出额外成本,却没有证据表明每个密码都已泄露。NIST、英国 NCSC 和 Microsoft 均建议不要让密码定期过期。应在有证据表明或有合理理由怀疑密码已泄露时、发现密码存储机制存在漏洞后,或账户恢复操作有此要求时更改密码。

组织仍然需要具备快速检测和重置密码的能力。取消定期更换并不意味着可以继续使用已知泄露的密码。

字符组合规则

强制要求密码包含大写字母、小写字母、数字和符号,会促使用户采用固定模式,例如首字母大写、末尾加一个数字或符号。攻击工具早已将这些替换方式纳入模型。服务应允许空格和广泛的字符输入,避免任意设置字符组合规则,并将完整的候选密码与常见密码及已泄露密码进行比对。

如果因为标点符号可能被用于 SQL 注入或跨站脚本攻击,就禁止密码包含标点符号,这是一个警示信号。应用代码必须使用参数化数据库查询,并以安全的方式处理输出。限制用户的密码不能替代修复注入漏洞。

密码重复使用与凭据泄露

密码重复使用是后果最严重的风险之一,因为一家服务提供商发生数据泄露,可能使攻击者得以访问用户在另一家的账户。密码策略应要求用户为该服务设置不与其他服务共用的密码,支持密码管理器,并以保护隐私的方式将候选密码与已知泄露的密码进行比对。组织还应监测凭据填充攻击模式和异常登录行为。

密码历史记录可以防止用户在同一服务中重复使用完全相同的密码,但历史记录列表过长,可能促使用户只做表面修改。它无法检测用户是否在其他服务提供商处重复使用密码,因此不应被视为主要防御措施。

安全的密码存储

密码只应通过受保护的 TLS 连接传输到服务端,绝不能写入日志。在服务器上,每个密码都必须使用独立的随机盐值,并通过专为此用途设计的慢速密码哈希函数进行处理。OWASP 通常推荐 Argon2id;在满足相应约束条件的情况下,scrypt、bcrypt 或 PBKDF2 也可能适用。随着硬件性能提升,需要定期审查计算成本参数。

将 pepper 存储在密码数据库之外,可以增加一层保护,但也会带来密钥管理和轮换的责任。它不能替代盐值或强健的密码哈希函数。MD5 和未经额外处理的 SHA-1/SHA-2 等快速通用哈希函数,单独使用时并不适合存储密码。

有效的密码策略应包含哪些内容

  • 设定与风险相适应的最低长度,并支持长密码。

  • 阻止使用常见、容易预料和已知泄露的密码。

  • 支持密码管理器、粘贴和自动填充。

  • 使用独立盐值和慢速密码哈希函数,并审查计算成本参数。

  • 分层实施速率限制,并检测密码猜测、密码喷洒和凭据填充攻击。

  • 采用抗钓鱼的 MFA 或通行密钥,尤其是针对特权账户和敏感账户。

  • 提供安全的账户恢复、身份验证器更换、会话撤销,以及因密码或账户失陷而触发的重置机制。

参考资料