15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
14.10.2024

如何评估密码强度:关于熵、抗破解性和安全凭证管理的技术指南

密码强度是衡量其抵御未授权发现的定量指标,包括抵御暴力破解攻击、字典攻击、凭据填充和统计猜测。它由三个复合变量决定:长度字符空间多样性不可预测性(熵)。根据当前NIST SP 800-63B标准,Shannon熵超过60位且包含至少16个来自混合字符集的字符的密码被认为具有密码学强度。

理解密码强度不仅仅是遵循清单——它需要掌握字符池、密码长度与攻击者所需计算成本之间的数学关系。本指南以精确的技术术语阐述这种关系,解释专业安全工程师如何评估凭据,并为个人用户和管理服务器及托管基础设施身份验证策略的系统管理员提供可操作的实践建议。

密码强度的实际衡量内容

密码强度是攻击成本的代理指标——具体来说,是攻击者在找到正确凭据之前必须进行的猜测次数。该成本使用以下公式以熵的位数表示:

H = L × log₂(N)

其中H是以位为单位的熵,L是以字符为单位的密码长度,N是字符池的大小(攻击者必须考虑的不同符号数量)。

熵值越高,意味着猜测工作量呈指数级增加。40位和80位之间的差异不是两倍的难度——而是2^40倍的难度,大约相当于额外需要一万亿次猜测。

字符池及其对熵的影响

字符集池大小 (N)每字符熵
仅小写字母 (a–z)264.70位
小写 + 大写字母525.70位
字母数字 (a–z, A–Z, 0–9)625.95位
完整可打印ASCII(含符号)956.57位
Diceware密码短语(EFF大词表)7,776个单词每个单词12.92位

此表说明了为什么在纯字母密码中添加一个符号就能产生可测量的熵增益,以及为什么四个单词的Diceware密码短语可以胜过复杂但较短的密码。

决定密码强度的关键因素

密码长度

长度是熵公式中影响最大的单一变量。在固定字符池的情况下,密码长度加倍会使搜索空间平方增长。请看以下对比:

  • 使用完整可打印ASCII的8字符密码:H = 8 × 6.57 = ~52.6 bits
  • 使用相同字符集的16字符密码:H = 16 × 6.57 = ~105 bits

在52.6位时,运行Hashcat对MD5哈希进行破解的现代GPU加速破解设备可以在数小时内穷举该空间。在105位时,同样的硬件需要地质时间尺度才能完成。NIST SP 800-63B建议用户自选密码的最低长度为8个字符,但注重安全的管理员应强制执行最低12–16个字符,且不设人为上限。

字符多样性与复杂性

混合字符类别可扩展N,从而增加每个字符的熵。强密码应包含以下内容:

  • 大写字母(A–Z)
  • 小写字母(a–z)
  • 数字(0–9)
  • 特殊字符!@#$%^&*等)

然而,许多指南忽略了一个关键细节:强制复杂性规则可能会适得其反地削弱密码强度。当用户被强制要求包含符号时,他们可预测地会在单词末尾附加!1。这种模式已被破解者熟知,并被编码到Hashcat等工具使用的规则集中。真正的复杂性来自随机性,而非满足复选框要求。

不可预测性与抵御模式攻击

现代密码破解并非纯粹的暴力破解。Hashcat和John the Ripper等工具使用基于规则的攻击,对字典单词应用变换——将首字母大写、将a替换为@、附加年份等。像P@ssw0rd!23这样的密码看似复杂,但由于遵循众所周知的替换模式,实际上很容易被破解。

真正的不可预测性意味着:

  • 不使用字典单词,即使是经过leet语替换的
  • 不使用键盘走位(qwertyzxcvbn
  • 不使用个人信息(姓名、生日、宠物名)
  • 不在开头或结尾使用可预测的模式(!后缀、1前缀)

不可预测性最可靠的来源是密码学安全随机数生成器(CSPRNG),这也是知名密码管理器内部使用的方式。

跨账户唯一性

凭据重用会将单次泄露转变为系统性危害。当以明文或弱MD5存储密码的服务遭到泄露时,攻击者会立即将这些凭据用于其他高价值目标——这种技术称为凭据填充。Gmail、银行门户和托管控制面板等服务是主要目标。

每个账户必须使用不同的密码。对于管理超过几个账户的大多数用户来说,没有密码管理器在操作上是不可能实现的。

评估密码强度的方法

熵计算

熵公式H = L × log₂(N)是最客观的衡量标准。以下是实际评估的参考值:

密码示例长度字符池熵(位)抵抗力
`password`826~37.6可忽略不计
`P@ssw0rd`895~52.6数小时(GPU)
`Tr0ub4dor&3`1195~72.3数月
`correct-horse-battery-staple`2826+1~130+数百年
随机16字符完整ASCII1695~105天文数字级

请注意,correct-horse-battery-staple——著名的XKCD密码短语——尽管仅使用小写字母和连字符,却通过长度实现了非凡的熵。这就是长度胜过复杂性的力量。

安全专业人员使用的密码破解工具

安全工程师和渗透测试人员使用以下工具对密码策略进行实证测试:

Hashcat是行业标准的GPU加速密码恢复工具。它支持超过300种哈希类型,可以运行字典、暴力破解、基于规则和混合攻击。在现代RTX 4090上,Hashcat每秒可以测试约1640亿个MD5哈希——这一背景使上述熵数字变得直观真实。

John the Ripper是一款基于CPU的破解工具,具有强大的基于规则的攻击能力和广泛的哈希格式支持。它常用于取证和审计场景。

zxcvbn是由Dropbox开发的客户端密码强度估算器。与简单的熵计算器不同,它通过检查字典、常见模式、键盘序列和日期格式来模拟真实的攻击者行为。它是面向用户应用程序中最准确的强度计量器。

要使用Hashcat在基准模式下离线测试密码哈希:

hashcat -b -m 0

要对MD5哈希文件运行带规则的字典攻击:

hashcat -a 0 -m 0 hashes.txt /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule

在线密码测试工具

多个基于浏览器的工具可提供快速强度评估:

  • Have I Been Pwned (HIBP) 密码检查——使用k-匿名模型将密码的SHA-1哈希前缀与超过8亿个泄露密码的数据库进行比对,这意味着完整密码永远不会被传输。
  • Bitwarden密码强度测试器——底层使用zxcvbn进行真实破解时间估算。
  • 卡巴斯基密码检查器——提供长度、复杂性和模式分析。

关键操作警告:切勿将真实使用中的密码输入任何在线工具。请使用结构相似但不同的测试凭据。即使是使用k-匿名模型的工具也不应接收您的实际生产密码。

应用程序中的密码强度计量器

内置强度计量器的质量差异显著。许多使用简单的启发式方法(长度阈值、字符类别存在性),这些方法可能被规避。将P@ssw0rd1!评为”强”的计量器具有误导性——该字符串出现在每个主要的泄露字典中。优先选择集成了zxcvbn或同等模式感知估算器的应用程序。

密码攻击向量:您实际防御的对象

理解威胁模型可以使每个关于密码策略的决策更加精准。

暴力破解攻击系统地尝试字符空间内的每种可能组合。它们受计算能力限制,在当前硬件条件下,超过约80位熵时变得不切实际。

字典攻击使用从泄露的真实密码中衍生的词表。RockYou数据集(1400万个密码)及其后继版本涵盖了绝大多数人类选择的密码。如果您的密码出现在自然语言中,它就在字典里。

基于规则的攻击对字典单词应用变换规则——大写、附加数字、符号替换。这些攻击能破解大多数用户通过修改简单单词构建的”复杂”密码。

凭据填充使用一次泄露中的用户名/密码对攻击其他服务。密码唯一性可完全防御此类攻击。

彩虹表攻击使用预计算的哈希到明文映射。在服务器端使用带有唯一盐值的适当密码哈希(bcrypt、Argon2、scrypt)可以防御此类攻击——这是应用程序的责任,而非用户的责任。

社会工程和网络钓鱼完全绕过密码强度。多因素身份验证是这里的主要防御手段。

创建和管理强密码的最佳实践

使用密码管理器

密码管理器是大多数用户和管理员可用的单一最高效安全改进措施。Bitwarden(开源、经过审计)、1PasswordKeePassXC(离线、本地存储)等工具可生成密码学随机密码并将其存储在加密保险库中。这消除了记忆的认知负担,使每个账户使用独特的20+字符随机密码成为可能。

对于管理跨服务器凭据的系统管理员——包括VPS托管环境和独立服务器——具有基于角色的访问控制的面向团队的密码管理器(如Bitwarden Teams或HashiCorp Vault)是必不可少的基础设施。

使用CSPRNG生成密码

切勿手动构建密码。使用您的密码管理器生成器,或在Linux/macOS上:

# Generate a 20-character random password using /dev/urandom
LC_ALL=C tr -dc 'A-Za-z0-9!@#$%^&*()-_=+' < /dev/urandom | head -c 20; echo
# Generate a Diceware-style passphrase using OpenSSL
openssl rand -base64 32

实施多因素身份验证(MFA)

MFA是任何具有重要价值的账户不可或缺的层级。即使密码被泄露,没有第二因素也无法获得访问权限。优先选择TOTP身份验证器应用(Authy、Google Authenticator、Aegis)而非基于SMS的双因素验证,后者容易受到SIM卡交换攻击。对于最高保障环境,使用硬件安全密钥(YubiKey、FIDO2),这些密钥在设计上具有抗网络钓鱼能力。

在运行Web应用程序或控制面板的服务器上——包括通过VPS控制面板管理的环境——在应用层强制执行MFA,并考虑将SSH密钥身份验证作为基于密码的SSH登录的完全替代方案。

在系统级别强制执行强密码策略

对于管理Linux服务器的管理员,PAM(可插拔身份验证模块)提供细粒度的密码策略执行。安装并配置libpam-pwquality

apt install libpam-pwquality

然后编辑/etc/security/pwquality.conf

minlen = 16
minclass = 3
maxrepeat = 2
gecoscheck = 1
dictcheck = 1

这将强制执行最少16个字符的长度,要求至少来自3个字符类别的字符,禁止超过2个连续相同字符,并检查字典单词和用户的GECOS字段(姓名)。

对于密码老化策略,编辑/etc/login.defs

PASS_MAX_DAYS   90
PASS_MIN_DAYS   1
PASS_WARN_AGE   14

监控凭据泄露

将泄露监控集成到您的安全运营中。Have I Been Pwned提供免费API,用于检查电子邮件地址是否出现在已知泄露数据库中。对于组织使用,SpyCloudEnzoic等服务提供实时凭据监控,并可在员工凭据出现在泄露数据集中时触发强制密码重置。

服务器端安全密码哈希

如果您运营存储用户凭据的Web应用程序——无论是在共享虚拟主机还是专用环境中——切勿以明文或弱哈希算法(MD5、SHA-1、无盐SHA-256)存储密码。使用专用密码哈希函数:

  • Argon2id——密码哈希竞赛获胜者;OWASP推荐用于新应用程序
  • bcrypt——广泛支持,经过实战检验;使用12或更高的工作因子
  • scrypt——内存密集型;对基于GPU的攻击具有良好抵抗力

使用Python的argon2-cffi库的示例:

from argon2 import PasswordHasher

ph = PasswordHasher(time_cost=2, memory_cost=65536, parallelism=2)
hash = ph.hash("user_supplied_password")
# Verify:
ph.verify(hash, "user_supplied_password")

密码短语作为实用替代方案

对于必须记忆的密码(密码管理器主密码、全盘加密密钥),Diceware密码短语提供了熵和可记忆性之间的最佳平衡。掷实体骰子五次,从EFF大词表中选择每个单词。五个单词产生约64.6位熵;六个单词产生77.5位熵。

Example: "clam-unmasked-revival-stunt-dagger"
Entropy: ~64.6 bits (5 words × 12.92 bits)

这比大多数用户选择的”复杂”密码更强,且更容易记忆。

保护您的托管基础设施中的凭据

密码安全不仅限于个人账户,还延伸到整个基础设施堆栈。管理托管环境的管理员应应用分层凭据控制:

  • SSH访问:完全禁用密码身份验证;使用Ed25519或RSA-4096密钥对。使用强密码短语保护私钥。
  • 数据库凭据:为数据库用户使用长的随机生成密码。切勿将root数据库账户用于应用程序连接。
  • 控制面板账户:为所有控制面板登录强制执行强密码和MFA。通过带cPanel的VPS访问的平台应将cPanel的密码强度执行设置为最低分数65。
  • 电子邮件账户:弱电子邮件密码是账户接管的主要攻击向量。如果您管理电子邮件托管,请在邮件服务器级别强制执行强密码策略,并启用DMARC、DKIM和SPF以减少网络钓鱼风险。
  • SSL/TLS私钥:使用文件系统权限(chmod 600)保护与SSL证书关联的私钥,并在可能的情况下将其存储在硬件安全模块(HSM)或密钥管理器中。

密码强度与密码策略:比较

维度用户责任管理员责任
密码生成使用基于CSPRNG的管理器强制执行最低熵要求
存储加密保险库(密码管理器)带唯一盐值的Argon2id/bcrypt
防止重用每个账户使用唯一密码通过PAM `remember`参数强制执行
泄露检测监控HIBP将泄露API集成到身份验证流程中
MFA在所有账户上启用在应用程序/服务器级别强制执行
轮换在疑似泄露时更改设置策略驱动的过期时间(90–180天)
SSH访问使用密钥对在`sshd_config`中禁用`PasswordAuthentication yes`

决策矩阵和技术关键要点

使用此清单评估和加固您当前的密码状况:

  • 熵目标:一般账户至少达到80位;特权访问(服务器root、密码管理器主密码、加密密钥)达到100位以上。
  • 长度下限:在您控制的任何系统中,切勿接受短于12个字符的密码;用户账户优先使用16–20个字符,服务账户和API密钥使用32个字符以上。
  • 字符池:随机生成的密码使用完整可打印ASCII;需要记忆的密码短语使用Diceware。
  • 唯一性:对凭据重用零容忍。部署密码管理器使其在操作上可行。
  • 哈希算法:Argon2id是当前服务器端密码存储的黄金标准。仅在您的技术栈中可用Argon2id时才从bcrypt迁移。
  • MFA层:最低使用TOTP;特权和管理账户使用FIDO2/WebAuthn。
  • SSH加固:禁用所有服务器上基于密码的SSH登录。在/etc/ssh/sshd_config中使用PasswordAuthentication no
  • 泄露监控:订阅所有组织电子邮件域的HIBP通知。
  • 审计频率:每季度使用Hashcat对您自己的哈希数据库运行密码审计,在攻击者之前识别弱凭据。
  • 策略执行:在Linux系统上使用PAM pwquality;通过组策略(细粒度密码策略)在Windows上强制执行等效控制。

常见问题

NIST在2024年推荐的最低密码长度是多少?

NIST SP 800-63B将用户自选密码的绝对最低长度设定为8个字符,但明确建议验证者允许密码长度至少达到64个字符。安全从业者应强制执行12–16个字符的实际最低长度,并鼓励敏感账户使用20个字符以上的密码短语。

带符号的12字符密码是否比20字符的小写密码短语更强?

不一定。随机生成的20字符小写密码短语具有约94位熵(20 × 4.70),而12字符混合ASCII密码具有约78.8位熵(12 × 6.57)。尽管使用较小的字符池,较长的密码短语在熵上仍然胜出——长度的复合效果比字符多样性更快。

字典攻击和暴力破解攻击有什么区别?

暴力破解攻击尝试定义空间内的每种可能字符组合——它是穷举性的,但受计算能力限制。字典攻击使用从泄露的真实密码、常用词和已知模式中衍生的精选词表。字典攻击可在数秒内破解绝大多数人类选择的密码;暴力破解仅用于完整搜索空间可处理的短密码。

即使没有泄露,我是否应该定期更改密码?

当前NIST指南(SP 800-63B)明确建议在没有泄露证据的情况下不要强制定期密码轮换,因为强制轮换会导致用户做出可预测的渐进式更改(例如,从Password1Password2)。在确认或疑似泄露时立即更改密码,并按照定义的时间表(90–180天)轮换服务账户凭据,作为风险管理实践。

如何在不将密码发送到第三方服务器的情况下检查我的密码是否已在数据泄露中暴露?

使用Have I Been Pwned Pwned Passwords API及其k-匿名实现。您的客户端计算密码的SHA-1哈希,仅将该哈希的前5个字符发送到API,并接收回所有匹配的哈希后缀。完整哈希——因此也包括密码——永远不会离开您的机器。这可以直接通过脚本实现:

PASSWORD="YourTestPassword"
HASH=$(echo -n "$PASSWORD" | sha1sum | awk '{print toupper($1)}')
PREFIX="${HASH:0:5}"
SUFFIX="${HASH:5}"
curl -s "https://api.pwnedpasswords.com/range/$PREFIX" | grep "$SUFFIX"

如果命令返回结果,则该密码已在泄露中出现,不得使用。

15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用