OpenSSL enc 命令概述#
openssl enc 是 OpenSSL 提供的对称加密命令行工具,支持多种加密算法和模式,常用于文件加密、数据保护等场景。
基本语法#
1
|
openssl enc -<算法> [选项] -in <输入文件> -out <输出文件>
|
常用选项:
-e:加密(默认)
-d:解密
-in:输入文件
-out:输出文件
-pass:指定密码来源
-salt:使用随机盐值(增强安全性)
-pbkdf2:使用 PBKDF2 密钥派生(推荐)
-base64:输出 Base64 编码格式
查看支持的加密算法#
常用算法:
aes-256-cbc:AES-256 CBC 模式(推荐)
aes-128-cbc:AES-128 CBC 模式
aes-256-ctr:AES-256 CTR 模式
des-ede3-cbc:3DES(不推荐)
实战示例#
1. 使用密码加密文件#
1
2
3
4
5
|
# 加密
openssl enc -aes-256-cbc -salt -pbkdf2 -in plaintext.txt -out encrypted.bin -pass pass:YourPassword
# 解密
openssl enc -d -aes-256-cbc -pbkdf2 -in encrypted.bin -out plaintext.txt -pass pass:YourPassword
|
说明:
-salt:添加随机盐值,相同密码加密相同内容会产生不同密文
-pbkdf2:使用 PBKDF2 算法从密码派生密钥,比旧方法更安全
2. 使用密钥文件加密#
生成随机密钥文件:
1
2
|
# 生成 32 字节(256 位)随机密钥
openssl rand -hex 32 > key.txt
|
使用密钥文件加密:
1
2
3
4
5
|
# 加密
openssl enc -aes-256-cbc -salt -pbkdf2 -in plaintext.txt -out encrypted.bin -pass file:key.txt
# 解密
openssl enc -d -aes-256-cbc -pbkdf2 -in encrypted.bin -out plaintext.txt -pass file:key.txt
|
优点: 密钥文件可以存储更高强度的密钥,适合自动化脚本。
3. 输出 Base64 编码#
Base64 编码便于在文本协议中传输:
1
2
3
4
5
|
# 加密并输出 Base64
openssl enc -aes-256-cbc -salt -pbkdf2 -base64 -in plaintext.txt -out encrypted.txt -pass pass:YourPassword
# 解密 Base64 格式
openssl enc -d -aes-256-cbc -pbkdf2 -base64 -in encrypted.txt -out plaintext.txt -pass pass:YourPassword
|
4. 从标准输入加密#
1
2
3
4
5
|
# 加密管道数据
echo "Secret Data" | openssl enc -aes-256-cbc -salt -pbkdf2 -pass pass:YourPassword -base64
# 解密管道数据
echo "U2FsdGVkX1..." | openssl enc -d -aes-256-cbc -pbkdf2 -pass pass:YourPassword -base64
|
安全注意事项#
必须使用 PBKDF2#
旧版本的密钥派生方式已被废弃:
1
2
3
|
# 不推荐(会显示警告)
openssl enc -aes-256-cbc -salt -in plaintext.txt -out encrypted.bin -pass pass:YourPassword
# 输出:*** WARNING : deprecated key derivation used.
|
推荐做法: 始终添加 -pbkdf2 选项。
密码强度#
- 使用密码时,确保足够复杂(建议 16 位以上,包含大小写、数字、符号)
- 生产环境推荐使用密钥文件(
openssl rand 生成)
算法选择#
| 算法 |
安全性 |
性能 |
建议 |
| AES-256-CBC |
高 |
高 |
推荐 |
| AES-128-CBC |
高 |
高 |
可用 |
| 3DES |
低 |
低 |
已淘汰 |
| DES |
极低 |
- |
禁止使用 |
GCM 模式限制#
OpenSSL enc 不支持 AEAD 密码(如 GCM):
1
2
|
openssl enc -aes-256-gcm -in plaintext.txt -out encrypted.bin -pass pass:pwd
# 输出:enc: AEAD ciphers not supported
|
如需 GCM 模式,应使用编程接口或其他工具。
解密失败处理#
密码错误时会提示:
1
2
|
bad decrypt
error:1C800064:Provider routines:ossl_cipher_unpadblock:bad decrypt
|
常见原因:
- 密码错误
- 算法/模式不匹配
- 文件损坏
- 缺少
-pbkdf2 选项(与加密时不一致)
完整示例脚本#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#!/bin/bash
# 文件加密脚本
FILE="secret.txt"
PASSWORD="YourStrongPassword123!"
# 加密
openssl enc -aes-256-cbc -salt -pbkdf2 -in "$FILE" -out "${FILE}.enc" -pass pass:"$PASSWORD"
# 解密
openssl enc -d -aes-256-cbc -pbkdf2 -in "${FILE}.enc" -out "${FILE}.dec" -pass pass:"$PASSWORD"
# 验证
diff "$FILE" "${FILE}.dec" && echo "解密成功,文件一致"
|
OpenSSL enc 是文件对称加密的实用工具。关键要点:
- 使用
-pbkdf2 进行安全的密钥派生
- 优先选择 AES-256-CBC 算法
- 生产环境使用密钥文件而非密码
- 加密和解密选项必须一致
参考来源#