对称加密实战:使用 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. 真实案例:加密配置文件

我参与过一个金融项目,需要把数据库连接串加密后存放在环境变量里。流程是这样的:

  1. 先用文本编辑器写好连接串,保存为 db.conf
  2. 执行加密命令:openssl enc -aes-256-cbc -pbkdf2 -iter 60000 -base64 -in db.conf -out db.enc
  3. 把 db.enc 的内容复制到环境变量里
  4. 每次程序启动时,调用解密命令读取真正的连接串
# 生产环境解密(带 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 图,方便你记忆。核心就是:密码 + 盐 → 密钥 → 加密 → 密文;反过来,密码 + 盐 + 密文 → 密钥 → 原文。

AES加密解密核心流程 AES 对称加密 / 解密核心流程 明文原文 (secret.txt) 用户密码 AES-256-CBC 加密引擎 (enc) 密文文件 (secret.enc) 解密流程 密文文件 (secret.enc) 同一密码 AES-256-CBC 解密引擎 (-d) 原文恢复 (secret_dec.txt) 加密和解密使用完全相同的算法和密码,区别仅在于是否添加 -d 参数 安全要点:密码通过 PBKDF2 + Salt 派生出 AES 密钥,迭代次数越高越安全

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