| name | implementing-aes-encryption-for-data-at-rest |
| description | AES(高级加密标准)是由 NIST(FIPS 197)标准化的对称分组密码,用于保护机密和敏感数据。本技能涵盖在 GCM 模式下实现 AES-256 加密,用于加密静态文件和数据存储,包括正确的密钥派生、IV/nonce 管理和认证加密。 |
| domain | cybersecurity |
| subdomain | cryptography |
| tags | ["cryptography","encryption","aes","data-at-rest","symmetric-encryption"] |
| version | 1.0 |
| author | mahipal |
| license | Apache-2.0 |
为静态数据实现 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)
验证标准