为静态数据实现 AES 加密
概述
AES(高级加密标准,Advanced Encryption Standard)是由 NIST(FIPS 197)标准化的对称分组密码(symmetric block cipher),用于保护机密和敏感数据。本技能涵盖在 GCM 模式下实现 AES-256 加密,用于加密静态文件和数据存储,包括正确的密钥派生(key derivation)、IV/nonce 管理和认证加密(authenticated encryption)。
目标
- 实现针对文件的 AES-256-GCM 加密和解密
- 使用 PBKDF2 和 Argon2 从密码派生加密密钥
- 安全管理初始化向量(IV,Initialization Vector)和 nonce
- 对整个目录树进行加密和解密
- 实现认证加密以检测篡改
- 使用流式加密处理大型文件
核心概念
AES 操作模式
| 模式 | 认证 | 可并行 | 使用场景 |
|---|---|---|---|
| GCM | 是(AEAD) | 是 | 网络数据、文件加密 |
| CBC | 否 | 仅解密 | 遗留系统、磁盘加密 |
| CTR | 否 | 是 | 流式加密 |
| CCM | 是(AEAD) | 否 | IoT、受约束环境 |
密钥派生
永远不要将原始密码用作加密密钥。始终使用以下方式派生密钥:
- PBKDF2:NIST 批准,广泛支持(截至 2024 年最少 600,000 次迭代)
- Argon2id:密码哈希竞赛冠军,内存密集型
- scrypt:内存密集型,Argon2 的良好替代方案
Nonce/IV 管理
- GCM 需要 96 位(12 字节)的 nonce,绝对不能在同一密钥下重复使用
- 使用
os.urandom()生成 nonce(密码安全伪随机数生成器,CSPRNG) - 将 nonce 与密文一起存储(nonce 不是秘密)
实现步骤
- 安装
cryptography库:pip install cryptography - 生成或派生加密密钥
- 为每次加密操作创建随机 nonce
- 使用密钥和 nonce 通过 AES-256-GCM 加密数据
- 将 nonce + 密文 + 认证标签一起存储
- 解密时,提取 nonce,验证标签,然后解密
加密文件格式
[salt: 16 字节][nonce: 12 字节][密文: 可变长度][标签: 16 字节]
安全注意事项
- 始终使用认证加密(GCM、CCM)以防止篡改
- 永远不要对同一密钥重复使用 nonce(在 GCM 中会造成灾难性后果)
- 对长期数据保护使用至少 256 位密钥
- 在可能的情况下,使用后安全清除内存中的密钥
- 根据组织策略定期轮换加密密钥
- 对于磁盘级加密,考虑使用 XTS 模式(AES-XTS)
验证标准
- AES-256-GCM 加密产生有效密文
- 解密能精确恢复原始明文
- 认证标签能检测任何密文修改
- 密钥派生使用足够的迭代次数/参数
- 同一密钥的 nonce 从不重复使用
- 大型文件(>1GB)可通过流式处理
- 加密文件格式包含所有必要的元数据