数据加密是保护敏感信息的关键技术,涵盖存储加密、传输加密和使用加密三大场景。以下是分层次的加密方案和最佳实践:
一、加密类型与场景选择
场景 | 推荐加密方式 | 典型应用 |
---|---|---|
数据库敏感字段存储 | AES-256(对称加密) | 用户密码、身份证号、银行卡号 |
网络传输 | TLS 1.3(非对称+对称) | API通信、浏览器HTTPS |
密钥管理 | RSA/ECC(非对称加密) | 加密主密钥或数据密钥 |
文件加密 | XChaCha20-Poly1305 | 云存储文件、备份数据 |
密码存储 | Argon2/Bcrypt(哈希) | 用户登录密码 |
二、分层加密实践指南
1. 数据库字段级加密
- 场景:保护用户手机号、身份证号等敏感字段。
- 方案:
// 使用 AES-GCM 加密(Java示例) public String encrypt(String plaintext, SecretKey key) throws Exception { Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); byte[] iv = new byte; // GCM推荐12字节IV SecureRandom.getInstanceStrong().nextBytes(iv); cipher.init(Cipher.ENCRYPT_MODE, key, new GCMParameterSpec(128, iv)); byte[] ciphertext = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); return Base64.getEncoder().encodeToString(iv) + ":" + Base64.getEncoder().encodeToString(ciphertext); } // 解密 public String decrypt(String encrypted, SecretKey key) throws Exception { String[] parts = encrypted.split(":"); byte[] iv = Base64.getDecoder().decode(parts); byte[] ciphertext = Base64.getDecoder().decode(parts); Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); cipher.init(Cipher.DECRYPT_MODE, key, new GCMParameterSpec(128, iv)); return new String(cipher.doFinal(ciphertext), StandardCharsets.UTF_8); }
- 关键点:
- 每个字段使用不同的IV(初始化向量)。
- 结合列级加密(如MySQL的
AES_ENCRYPT
)或应用层加密。
2. 传输层加密(TLS优化)
- 配置最佳实践:
# Nginx TLS配置示例 ssl_protocols TLSv1.3 TLSv1.2; ssl_ciphers 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384'; ssl_prefer_server_ciphers on; ssl_session_timeout 1d; ssl_session_tickets off; # 启用OCSP Stapling
- 工具验证:
openssl s_client -connect yourdomain.com:443 -tls1_3
3. 密钥管理(KMS集成)
- 架构设计:
- 密钥轮换策略:
- 数据密钥(DEK)每次加密随机生成。
- 主密钥(KEK)每90天轮换,旧密钥不解绑,仅用于解密历史数据。
4. 密码存储(防彩虹表)
- 代码示例:
// 使用Argon2哈希(Spring Security) PasswordEncoder encoder = Argon2PasswordEncoder.defaultsForSpringSecurity_v5_8(); String hashedPassword = encoder.encode("user_password"); // 验证 boolean matches = encoder.matches("input_password", hashedPassword);
三、密钥生命周期管理
- 生成:
- 使用硬件安全模块(HSM)或云KMS(如AWS KMS、阿里云KMS)。
- 存储:
- 主密钥:HSM或KMS中存储,永不暴露。
- 数据密钥:加密后与数据同存储。
- 轮换:
- 数据密钥每次加密随机生成。
- 主密钥定期轮换(如90天),旧密钥保留用于解密历史数据。
- 销毁:
- 安全擦除密钥材料,并在KMS标记为已销毁。
四、进阶方案
1. 同态加密(隐私计算)
- 场景:在不解密数据的情况下进行计算(如医疗数据分析)。
- 库推荐:
- Microsoft SEAL(BFV/CKKS方案)
- PALISADE(支持多种方案)
2. 量子安全加密
- 算法准备:
- 密钥封装:Kyber
- 数字签名:Dilithium
- 混合部署:
# 使用混合加密(RSA + Kyber) ciphertext_rsa = encrypt_rsa(shared_key) ciphertext_kyber = encrypt_kyber(shared_key) # 同时传输两种密文,接收方用任意一种解密
3. 数据库透明加密(TDE)
- 方案:
- MySQL:
keyring_file
插件 + InnoDB表空间加密。 - PostgreSQL:
pgcrypto
扩展 + 表级加密。
- MySQL:
五、合规与审计
- 标准合规:
- PCI-DSS:要求加密存储卡号,使用强TLS配置。
- GDPR:加密个人数据,记录处理活动。
- 审计日志:
- 记录所有密钥操作(生成、使用、销毁)。
- 使用SIEM(如Splunk)监控异常解密行为。
六、常见陷阱与规避
陷阱 | 解决方案 |
---|---|
硬编码密钥 | 使用环境变量/KMS动态注入 |
IV重复使用 | 每次加密生成随机IV |
弱哈希算法(MD5/SHA1) | 升级至Argon2/Bcrypt |
未启用TLS证书校验 | 客户端启用证书固定(Certificate Pinning) |
密钥与数据同存储 | 分离存储,加密密钥层级化 |
通过分层加密策略和严格的密钥管理,可构建从静态存储到动态传输的全链路安全防护,平衡安全需求与系统性能。