理论讲再多,不如亲手写一遍。这一节,我们分别用 Python、Go、Java 三种语言,展示一个完整的对称加密流程。我们选择 AES-256-GCM 作为加密算法,因为它既提供机密性(加密)又提供完整性(认证),是目前最推荐的对称加密方案之一。示例将涵盖:生成密钥、随机 IV、加密、解密,并演示如何处理异常。
所有代码都遵循了我们之前讨论的安全原则:
- 使用密码学安全的随机数生成器
- 使用认证加密模式(GCM)
- 密钥和 IV 的正确管理
- 解密时对错误的正确处理
Python 示例(使用 cryptography 库)
import os |
关键点:
os.urandom提供安全随机数。modes.GCM自动处理认证标签,密文被篡改会抛出异常。- 返回时把 IV、密文、标签打包在一起,便于传输。
Go 示例(使用标准库 crypto/aes + crypto/cipher)
package main |
关键点:
- 使用
crypto/rand生成随机数。 cipher.NewGCM返回认证加密对象。Seal和Open自动处理认证标签,验证失败返回错误。
Java 示例(使用 javax.crypto)
import javax.crypto.Cipher; |
关键点:
SecureRandom用于生成安全随机 IV。AES/GCM/NoPadding模式,注意 GCM 标签长度需显式设置(单位是位,所以 16 字节 = 128 位)。- 解密时若认证失败会抛出
AEADBadTagException。
关于密钥存储的提醒
上述示例为演示方便,密钥是临时生成的。在生产环境中,密钥绝不能硬编码在代码中,也不应写在配置文件里。正确的做法是使用密钥管理系统(KMS),例如:
- 云服务商提供的 KMS(AWS KMS、Google Cloud KMS、Azure Key Vault)。
- 本地硬件安全模块(HSM)。
- 环境变量 + 安全存储(如 HashiCorp Vault)。
即使开发测试,也应使用环境变量或单独的配置文件,并确保这些文件不提交到版本控制系统。
小结
通过这三个语言的实战,你应该能掌握安全对称加密的标准写法:
- 使用认证加密模式(GCM、ChaCha20-Poly1305)。
- 每次加密都生成新的随机 IV。
- 将 IV 与密文一起传输,并在解密时使用。
- 正确处理异常,防止信息泄露。
当你需要在项目中集成加密时,直接参考这些示例,并根据具体场景选择合适的库和参数。安全开发不是一蹴而就,但遵循最佳实践,就能避开绝大多数常见陷阱。