5. 密码攻击 Password Attack
认证基础(Authentication Basics)
- 定义: 确认实体声明的属性真实性, 常用于验证用户或设备的身份(Identity);
- 目的:
- 实施访问控制策略(Access Control Policies)
- 防止冒充攻击(Impersonation Attacks)
- 示例:
- 网站通过密码认证用户
- 手机通过指纹识别机主
- 浏览器通过证书验证服务器
- 目的:
认证方式(Authentication Factors)
- 所知之物(Something You Know)
密码(Password), PIN码, 密钥 - 所有之物(Something You Have)
手机, 安全令牌(Security Token), 身份证 - 所是之物(Something You Are)
生物特征(Biometrics): 指纹, 面部识别(FaceID), 虹膜扫描
密码问题与防御(Password Problems & Defenses)
-
常见弱密码问题:
- 用户倾向于选择简单密码(如
123456,password); - 防御建议:
- 用户: 使用密码管理器(Password Manager), 启用双因素认证(2FA/MFA);
- 开发者: 避免强制密码复杂度规则, 支持第三方登录(OAuth);
- 用户倾向于选择简单密码(如
-
在线密码猜测攻击(Online Guessing):
-
攻击方法:
- 单个网站多次测试登陆: 会被 Lock Account after n Guess
方法防御, 但是这个方法会有一定的缺点: 攻击者可以暴力测试密码让原用户
被拒绝服务 - 多个网站测试同一密码
- 单个网站多次测试登陆: 会被 Lock Account after n Guess
-
防御措施:
- 账户锁定(Lock Account after n Guess): 缺点如上
- 登录速率限制(Rate-Limit): 一定时间内限制登录次数, 可以有效解决上述问题
- 异常检测 (Anomaly Detection): 检测异常登录行为, 如异地 (短时间内登录地点变化很大) 登录
- CAPTCHA验证(Completely Automated Public Turing Test): 防止机器人攻击,
生成的密码让人类很容易解决但是很难被机器人解决
-
密码泄露风险(Password Breaches)
-
本地存储方案对比:
方案 优点 缺点 明文存储(Plaintext) 简单 泄露即灾难性后果 加密存储(Encrypted) 需密钥解密 密钥管理风险 哈希存储(Hashing) 不存储明文 相同密码哈希相同 盐值哈希(Salted Hash) 唯一盐值(Salt)使相同密码哈希不同 需强哈希函数(如bcrypt, argon2) -
离线密码猜测(Offline Guessing):
-
攻击方法:
- 字典攻击(Dictionary Attack): 使用常见密码字典破解;
- 暴力攻击(Brute Force Attack): 逐个尝试所有可能密码;
- 具体方法可以见下文的 John-the-Ripper 工具
-
彩虹表攻击(Rainbow Table): 通过预计算哈希加速破解,
常常与字典攻击结合使用; -
盐值防御: 针对彩虹表攻击进行的特殊防御措施, 每个密码使用唯一盐值, 增加攻击成本;
加盐哈希问题
- 流程:
- 生成随机盐值 salt
- 计算
st = hash(salt||pswd)并且存储salt||st到数据库 - 验证时, 从数据库中取出
salt||st, 计算st2 = hash(salt||pswd'), 比较st和st2
- 盐值太短: 攻击者可以构造一个查询表包含所有可能的盐值,
好点的做法是拥有和哈希函数输出一样长的盐值 - 盐值重复: 两个相同的密码依然会得到相同的哈希值; 攻击者仍然可以使用反向查表法对每个值进行字典攻击
-
-
硬件安全(Hardware Defense):
- 安全飞地(Secure Enclave): 防篡改硬件存储哈希, 限制猜测次数;
-
社会工程攻击(Social Engineering):
- 钓鱼攻击(Phishing): 伪造网站诱骗用户输入密码;
- 鱼叉式钓鱼(Spear Phishing): 针对特定个体的精细化攻击;
John-the-Ripper 开源密码破解工具
简介和背景
由于Linux是Internet最流行的服务器操作系统,因此它的安全性备受关注,这种安全主要靠口令实现
Linux使用一个单向函数 crypt() 来加密用户口令;单向函数 crypt() 从数学原理上保证了从加密的密文得到加密前的明文是不可能的或是非常困难的;
当用户登录系统时,系统并不是去解密已加密的口令, 而是将输入的口令明文字符串传给加密函数, 将加密函数的输出与 /etc/passwd 文
件中该用户的PASSWORD域进行比较,若匹配成功,则允许用户登录系统;
John-the-Ripper 是一款免费,开源的暴力密码破解器,它有多平台版本,支持目前大多数的加密算法,如DES, MD4, MD5等;
该软件破解密码方式简单而粗暴,理论上只要时间上面允许,该软件可以破译绝大多数用户密码;
用法
在 macOS 上面安装 John-the-Ripper:
1 | brew install john-jumbo |
简单的使用方式是 john --wordlist=/path/to/wordlist.txt /path/to/passwords.txt,
其中 john 会基于你提供的 wordlist 为起步阶段来做各种尝试, wordlist
是网络上很多用户常用的密码集合, 最著名的公用 wordlist 是 rockyou.txt
如果不提供 wordlist, john 会使用自带的 wordlist
Hash 密码形式
一般而言的哈希函数开头是 $id 形式, 通过 id 来说明其采用的 哈希函数类型
(例如sha512 对应的 id 是 $6)
在 id 之后的是 $salt, salt 是一个随机数, 用于增加哈希函数的复杂度, 使得破解更加困难
在 salt 之后的是 $hash, 哈希值是通过哈希函数对明文进行加密得到的
例如: alewilki:bI7W6lYKCF3Wmcl1$aXjOd1y9L6gqoxbzPFxbeAOS9BDEIODKy6j0hzMGQks8BhPZbWM/2WmeUeQreDVPtRzRHQU7iGd9gwst3bstI.
- 类型: sha512 ~
$6 - salt:
$bI7W6lYKCF3Wmcl1$ - hash:
$aXjOd1y9L6gqoxbzPFxbeAOS9BDEIODKy6j0hzMGQks8BhPZbWM/2WmeUeQreDVPtRzRHQU7iGd9gwst3bstI.
多因素认证(Multi-Factor Authentication, MFA)
-
核心原则: 结合至少两种认证因素(如密码+手机验证);
-
实现方式:
类型 机制 缺点 一次性密码(OTP) 基于时间(TOTP)或计数器(HOTP) 易受钓鱼攻击(Phishing) 短信SMS/电话验证 发送验证码至用户手机 可能被劫持或社工攻击 U2F/WebAuthn 基于硬件的挑战-响应协议(Challenge-Response) 需专用设备(如YubiKey)
钓鱼攻击(Phishing)与鱼叉式钓鱼(Spear Phishing)攻击
- 钓鱼攻击: 通过发送伪造的群发邮件, 诱导大量潜在受害者泄露个人信息(如密码, 银行卡号等);例如, 伪装成银行或知名企业的虚假通知;
- 鱼叉式钓鱼: 更高级的定向攻击, 针对特定个人或组织, 利用目标详细信息(如职务, 社交关系)设计高度定制化的欺诈手段;例如, 伪造同事或合作伙伴的邮件, 诱骗转账或提供敏感数据;
One-Time Password (OTP)
- 定义: 一次性密码, 每次登录或交易时生成, 短时间内有效;
HOTP:
The HOTP scheme is defined as follows
where is the shared HMAC key, is the current counter value, and is an instantiation of the HMAC scheme with any given hash function
Truncate is a function that takes an HMAC value and returns a truncated version of it
Take the last four bits of the output of HMAC, and interpret it as an integer. Being four bits, it can range from 0 to 15. This is the offset.
Interpret the four bytes starting at this offset in the output of HMAC as a
big-endian integer. This is n.
Set the highest bit of n to 0, so that it is a 31-bit integer. (i.e. n = n & 0x7FFFFFFF.)
. (i.e. n = n & 0x7FFFFFFF.)
Output the d-digit number d mode 10^n, padding with leading zeros if
necessary. (d is agreed upon between the user and the service on registration.)
1 | int offset = hmac_result[19] & 0xf ; |
TOTP:
由于收发两端对于 counter 的数据维持一致是很难做到的, 因此使用 unix time 来代替
counter 并且要允许有一定的时间误差, 一般设置为半分钟
p is the time step in seconds, typically 30
这个方法被 Google Authenticator 采用
U2F Universal 2nd Factor
- 一种开放标准, 它使用基于智能卡中类似安全技术的专用通用串行总线 (USB), 近场通信 (NFC) 或低功耗蓝牙 (BLE) 设备来增强和简化双因素身份验证
- 相当于把用户密钥放到了一个硬件设备上
- 会测试 网页 server 的 origin 是否和 U2F 设备的 origin 一致, 防止 phishing 攻击

- 可以预防 replay attack: 每次的 challenge 都不一样
- 可以预防 relay attack (中继攻击, 类似 mitm 模型): 通过测试 origin 来防止
生物识别(Biometrics)
- 优点: 不可丢失, 便捷;
- 缺点:
- 依赖可信传感器(Trusted Sensor)
- 生物特征不可更改(Immutable)
- 常见技术:
- 指纹识别(Fingerprint)
- 面部识别(FaceID)
- 虹膜扫描(Retinal Scanner)
