## 加密缺陷（High）

### 触发信号

- 硬编码密钥/密码（`password`/`secret`/`apikey`/`token` 赋值为字符串常量）
- 使用弱加密算法（`md5`、`sha1`、`DES`、`RC4`、`ECB` 模式）
- 不安全的随机数（`Math.random()`、`random.random()` 用于安全场景）
- 自定义加密实现（非标准算法、手动实现的加密）

### 关键 Sink

| 缺陷类型 | 检查点 |
|---------|--------|
| 硬编码密钥 | `SECRET = "..."`、`API_KEY = "..."`、`password: "..."` |
| 弱哈希 | `md5()`、`sha1()`（用于密码存储或签名） |
| 弱加密 | `DES`、`RC4`、`ECB` 模式、`AES` + 固定 IV |
| 不安全随机 | `Math.random()`、`random.random()`（用于 Token/密钥/盐值） |
| 自定义加密 | 非 `crypto`/`openssl`/`nacl` 库的手动实现 |

### 判定流程

1. **检查硬编码密钥**：`Grep` 搜索 `secret`、`password`、`apikey`、`private_key`、`token` 赋值为字符串常量，`Read` 确认：
   - 是否为生产环境密钥（非测试/mock 值）
   - 是否应从环境变量/密钥管理服务获取
2. **检查算法强度**：`Read` 确认使用的加密/哈希算法：
   - 密码存储：应使用 `bcrypt`/`argon2`（非 MD5/SHA）
   - 数据加密：应使用 `AES-256-GCM`（非 DES/RC4/ECB）
   - 数字签名：应使用 `RSA-2048+`/`ECDSA P-256+`（非 MD5/SHA1）
   - IV/Nonce：应为随机生成且唯一（非固定值）
3. **检查随机数安全性**：`Read` 确认安全相关场景使用的随机数生成器：
   - `crypto.randomBytes()`（Node.js）、`secrets`（Python）、`java.security.SecureRandom` → 安全
   - `Math.random()`、`random.random()`、`rand()` → 不安全
4. **检查自定义加密**：`Read` 确认是否使用标准库（`crypto`、`openssl`、`nacl`、`cryptography`），而非自行实现

### 证据构造

确认缺陷后，输出需包含：
- 缺陷位置（硬编码值/弱算法使用位置，含文件:行号）
- 风险等级（硬编码密钥 → Critical，弱哈希 → High，弱随机 → Medium）
- 替代方案（应使用的安全算法/获取密钥的方式）
- 业务影响（密钥泄露、数据可被解密、Token 可被预测）

### 排除

- 测试/Mock 环境的硬编码值（文件名含 `test`/`mock`/`fixture`）
- 已从环境变量获取密钥（`process.env.SECRET`）
- `MD5`/`SHA1` 用于非安全场景（文件校验、缓存 key，非密码/签名）
- `Math.random()` 用于非安全场景（UI 动画、随机排序）
