OpenSSL enc 命令概述

openssl enc 是 OpenSSL 提供的对称加密命令行工具,支持多种加密算法和模式,常用于文件加密、数据保护等场景。

基本语法

1
openssl enc -<算法> [选项] -in <输入文件> -out <输出文件>

常用选项:

  • -e:加密(默认)
  • -d:解密
  • -in:输入文件
  • -out:输出文件
  • -pass:指定密码来源
  • -salt:使用随机盐值(增强安全性)
  • -pbkdf2:使用 PBKDF2 密钥派生(推荐)
  • -base64:输出 Base64 编码格式

查看支持的加密算法

1
openssl enc -ciphers

常用算法:

  • 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

常见原因:

  1. 密码错误
  2. 算法/模式不匹配
  3. 文件损坏
  4. 缺少 -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 是文件对称加密的实用工具。关键要点:

  1. 使用 -pbkdf2 进行安全的密钥派生
  2. 优先选择 AES-256-CBC 算法
  3. 生产环境使用密钥文件而非密码
  4. 加密和解密选项必须一致

参考来源