对称加密实战:使用 enc 命令进行 AES 加密与解密
对称加密,说白了就是加密和解密用同一把钥匙。你想想看,这就像你家里的防盗门,钥匙插进去锁门,再插一次开门。AES 是目前最主流的对称加密算法,我在项目里几乎每天都在用它。OpenSSL 的 enc 命令,就是干这个活的瑞士军刀。
一句话总结:enc 命令负责用指定算法把明文变成密文,也能把密文变回明文。核心就是一把密钥。
1. AES 加密的基本套路
咱们先看看最简单的用法。假设我有一个文件 secret.txt,里面存着公司的数据库密码。我想把它加密存起来。
# 加密一个文件
openssl enc -aes-256-cbc -salt -in secret.txt -out secret.enc
输入这条命令后,终端会提示你输入密码。注意,这里输入的 密码 不是密钥,OpenSSL 会通过 KDF(密钥派生函数)自动把它变成 256 位的 AES 密钥。我个人习惯用 -pbkdf2 参数替代默认的 EVP_BytesToKey,更安全。
⚠️ 重要提醒:如果忘了密码,数据就彻底废了。我曾经有个同事,把加密后的备份文件密码写在便利贴上,结果便利贴被保洁阿姨扔了……嗯,后来他花了两天时间重新生成配置。
2. 解密:把密文变回来
解密也很直接:
# 解密文件
openssl enc -d -aes-256-cbc -in secret.enc -out secret_dec.txt
注意看,我加了 -d 参数,代表解密。OpenSSL 会自动从密文头部读取 salt,然后让你输入密码。如果密码错了,它不会告诉你“密码错误”,而是直接输出一堆乱码。所以,输入密码时一定要确认环境。
3. 核心参数,一个一个说清楚
enc 命令的参数不少,但常用的就那几个。我整理了一张表,方便你查阅:
| 参数 | 作用 | 我的建议 |
|---|---|---|
-aes-128-cbc / -aes-256-cbc |
指定 AES 模式和密钥长度 | 推荐 256 位,安全余量大 |
-salt |
加盐,防止彩虹表攻击 | 必须加,默认已开启 |
-pbkdf2 |
使用 PBKDF2 密钥派生 | 建议加上,替代老旧的 EVP |
-iter N |
设置 PBKDF2 迭代次数 | 10000 起步,我习惯用 60000 |
-base64 / -A |
输出 Base64 编码的密文 | 用于文本传输时加 -base64 |
-k |
直接在命令行指定密码 | 千万别用,会泄露在进程列表里 |
重点来了:如果你需要把加密结果通过邮件或 API 传输,记得加 -base64。这样密文就是纯文本格式,不会出现乱码或特殊字符。
4. 真实案例:加密配置文件
我参与过一个金融项目,需要把数据库连接串加密后存放在环境变量里。流程是这样的:
- 先用文本编辑器写好连接串,保存为
db.conf - 执行加密命令:
openssl enc -aes-256-cbc -pbkdf2 -iter 60000 -base64 -in db.conf -out db.enc - 把
db.enc的内容复制到环境变量里 - 每次程序启动时,调用解密命令读取真正的连接串
# 生产环境解密(带 Base64)
openssl enc -d -aes-256-cbc -pbkdf2 -iter 60000 -base64 -in db.enc -out /tmp/db.conf
你可能会问:迭代次数设成 60000,解密不会卡吗?其实只会慢几百毫秒,换来的是暴力破解难度呈几何级上升,这笔账怎么算都划算。
5. 避坑指南:我踩过的三个坑
干这行十年,对称加密这块我也翻过车。分享几个教训:
- 我曾经直接用
-k参数写密码: 结果测试环境的所有进程列表都能看到明文密码。后来改用了pass:环境变量的方式,安全多了。 - 千万不要用
-nosalt: 去掉 salt 后,相同的明文会加密出相同的密文。我在一个合规审计项目里发现有人这么干,当场被客户的安全团队约谈。 - 版本兼容问题要当心: 用 OpenSSL 1.1.1 加密的文件,在 3.0 版本下默认解密可能失败,因为默认的密钥算法变了。建议在加密时显式指定
-md sha256。
6. 核心逻辑:一张图看懂
我把上面讲的整个流程画成了一张 SVG 图,方便你记忆。核心就是:密码 + 盐 → 密钥 → 加密 → 密文;反过来,密码 + 盐 + 密文 → 密钥 → 原文。
7. 常用参数速查表
最后,我把生产环境最常用的一组参数列出来,你直接复制粘贴就能用:
| 场景 | 加密命令 | 解密命令 |
|---|---|---|
| 文件加密(本地) | openssl enc -aes-256-cbc -pbkdf2 -iter 60000 -in file.txt -out file.enc |
openssl enc -d -aes-256-cbc -pbkdf2 -iter 60000 -in file.enc -out file.txt |
| 网络传输(Base64) | openssl enc -aes-256-cbc -pbkdf2 -base64 -in file.txt -out file.b64 |
openssl enc -d -aes-256-cbc -pbkdf2 -base64 -in file.b64 -out file.txt |
| 无交互密码(环境变量) | openssl enc -aes-256-cbc -pbkdf2 -pass env:MY_KEY -in file.txt -out file.enc |
openssl enc -d -aes-256-cbc -pbkdf2 -pass env:MY_KEY -in file.enc -out file.txt |