前置知识: 网络安全

OpenSSL 加密解密

2 min入门

OpenSSL 加解密命令:对称加解密(AES-GCM/CBC)、口令派生(PBKDF2/scrypt)、非对称加解密与数字信封

对称加密

基本写法:AES 加密文件 openssl enc -aes-256-cbc -salt -pbkdf2 -in <输入> -out <输出>

# 使用 AES-256-CBC 加密文件
openssl enc -aes-256-cbc -salt -pbkdf2 -in plaintext.txt -out encrypted.enc

基本写法:AES 解密文件 openssl enc -d -aes-256-cbc -pbkdf2 -in <文件> -out <输出>

# 解密 AES 加密的文件
openssl enc -d -aes-256-cbc -pbkdf2 -in encrypted.enc -out decrypted.txt

基本写法:使用密码加密 openssl enc -aes-256-cbc -salt -pbkdf2 -pass pass:<密码> -in <输入> -out <输出>

# 直接指定密码加密
openssl enc -aes-256-cbc -salt -pbkdf2 -pass pass:secret123 -in plaintext.txt -out encrypted.enc

基本写法:使用密钥文件加密 openssl enc -aes-256-cbc -salt -pbkdf2 -pass file:<密钥文件> -in <输入> -out <输出>

# 使用密钥文件加密
openssl enc -aes-256-cbc -salt -pbkdf2 -pass file:./keyfile -in plaintext.txt -out encrypted.enc

基本写法:指定密钥和 IV 加密 openssl enc -aes-256-cbc -K <十六进制密钥> -iv <十六进制IV> -in <输入> -out <输出>

# 使用指定的密钥和 IV 加密
openssl enc -aes-256-cbc -K 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef -iv 0123456789abcdef0123456789abcdef -in plaintext.txt -out encrypted.enc

支持的加密算法

基本写法:列出所有支持的算法 openssl enc -list

# 列出所有支持的加密算法
openssl enc -list

基本写法:ChaCha20 加密 openssl enc -chacha20 -salt -pbkdf2 -in <输入> -out <输出>

# 使用 ChaCha20 加密
openssl enc -chacha20 -salt -pbkdf2 -in plaintext.txt -out encrypted.enc

基本写法:AES-128 加密 openssl enc -aes-128-cbc -salt -pbkdf2 -in <输入> -out <输出>

# 使用 AES-128-CBC 加密
openssl enc -aes-128-cbc -salt -pbkdf2 -in plaintext.txt -out encrypted.enc

基本写法:Camellia 加密 openssl enc -camellia-256-cbc -salt -pbkdf2 -in <输入> -out <输出>

# 使用 Camellia-256 加密
openssl enc -camellia-256-cbc -salt -pbkdf2 -in plaintext.txt -out encrypted.enc

非对称加密(RSA)

基本写法:使用公钥加密 openssl rsautl -encrypt -inkey <公钥> -pubin -in <输入> -out <输出>

# 使用 RSA 公钥加密文件
openssl rsautl -encrypt -inkey public.key -pubin -in plaintext.txt -out encrypted.enc

基本写法:使用私钥解密 openssl rsautl -decrypt -inkey <私钥> -in <文件> -out <输出>

# 使用 RSA 私钥解密
openssl rsautl -decrypt -inkey private.key -in encrypted.enc -out decrypted.txt

基本写法:使用 OAEP 填充加密 openssl rsautl -encrypt -oaep -inkey <公钥> -pubin -in <输入> -out <输出>

# 使用 OAEP 填充方案更安全
openssl rsautl -encrypt -oaep -inkey public.key -pubin -in plaintext.txt -out encrypted.enc

基本写法:查看 RSA 密钥信息 openssl rsa -in <私钥> -text -noout

# 查看 RSA 私钥详细信息
openssl rsa -in private.key -text -noout

数字签名

基本写法:使用 RSA 签名文件 openssl dgst -sha256 -sign <私钥> -out <签名> <文件>

# 使用 SHA-256 和 RSA 私钥签名文件
openssl dgst -sha256 -sign private.key -out signature.sig document.pdf

基本写法:验证签名 openssl dgst -sha256 -verify <公钥> -signature <签名> <文件>

# 验证文件的数字签名
openssl dgst -sha256 -verify public.key -signature signature.sig document.pdf

基本写法:使用 ECDSA 签名 openssl dgst -sha384 -sign <EC私钥> -out <签名> <文件>

# 使用 EC 私钥签名
openssl dgst -sha384 -sign ec_key.pem -out signature.sig document.pdf

基本写法:使用 pkeyutl 签名 openssl pkeyutl -sign -inkey <私钥> -in <文件> -out <签名>

# 使用 pkeyutl 签名
openssl pkeyutl -sign -inkey private.key -in document.pdf -out signature.sig

基本写法:使用 pkeyutl 验证 openssl pkeyutl -verify -inkey <公钥> -pubin -in <文件> -sigfile <签名>

# 使用 pkeyutl 验证签名
openssl pkeyutl -verify -inkey public.key -pubin -in document.pdf -sigfile signature.sig

哈希计算

基本写法:计算文件 SHA-256 openssl dgst -sha256 <文件>

# 计算文件的 SHA-256 哈希
openssl dgst -sha256 document.pdf

基本写法:计算文件 MD5 openssl dgst -md5 <文件>

# 计算文件的 MD5 哈希
openssl dgst -md5 document.pdf

基本写法:计算字符串哈希 echo -n "<字符串>" | openssl dgst -sha256

# 计算字符串的 SHA-256 哈希
echo -n "hello world" | openssl dgst -sha256

基本写法:列出所有摘要算法 openssl list -digest-algorithms

# 列出所有支持的哈希算法
openssl list -digest-algorithms

基本写法:计算 HMAC openssl dgst -sha256 -hmac "<密钥>" <文件>

# 计算文件的 HMAC-SHA256
openssl dgst -sha256 -hmac "secret_key" document.pdf

基本写法:二进制哈希输出 openssl dgst -binary -sha256 <文件>

# 输出二进制形式的哈希
openssl dgst -binary -sha256 document.pdf

随机数生成

基本写法:生成随机字节 openssl rand -hex <字节数>

# 生成 16 字节的随机十六进制字符串
openssl rand -hex 16

基本写法:生成 Base64 随机数 openssl rand -base64 <字节数>

# 生成 32 字节的 Base64 随机数
openssl rand -base64 32

基本写法:生成二进制随机数 openssl rand <字节数> > <文件>

# 生成 1024 字节随机数到文件
openssl rand 1024 > random.bin

基本写法:使用随机数作为密钥 openssl rand -hex 32

# 生成 256 位的十六进制密钥
openssl rand -hex 32

Base64 编码解码

基本写法:Base64 编码 openssl base64 -in <输入> -out <输出>

# 编码文件为 Base64
openssl base64 -in plaintext.txt -out encoded.b64

基本写法:Base64 解码 openssl base64 -d -in <文件> -out <输出>

# 解码 Base64 文件
openssl base64 -d -in encoded.b64 -out decoded.txt

基本写法:字符串编码 echo -n "<字符串>" | openssl base64

# 编码字符串为 Base64
echo -n "hello world" | openssl base64

基本写法:字符串解码 echo "<Base64>" | openssl base64 -d

# 解码 Base64 字符串
echo "aGVsbG8gd29ybGQ=" | openssl base64 -d

加密通信测试

基本写法:测试 TLS 连接 openssl s_client -connect <主机>:<端口>

# 测试 HTTPS 连接
openssl s_client -connect example.com:443

基本写法:指定 TLS 版本 openssl s_client -tls1_2 -connect <主机>:<端口>

# 强制使用 TLS 1.2
openssl s_client -tls1_2 -connect example.com:443

基本写法:查看证书链 openssl s_client -showcerts -connect <主机>:<端口>

# 查看完整证书链
openssl s_client -showcerts -connect example.com:443

基本写法:测试 SMTP TLS openssl s_client -starttls smtp -connect <主机>:<端口>

# 测试 SMTP 服务的 TLS
openssl s_client -starttls smtp -connect smtp.example.com:587

基本写法:列出支持的密码套件 openssl ciphers -v

# 列出所有支持的密码套件
openssl ciphers -v

基本写法:测试特定密码套件 openssl s_client -cipher <密码套件> -connect <主机>:<端口>

# 测试服务器是否支持特定密码套件
openssl s_client -cipher 'ECDHE-RSA-AES256-GCM-SHA384' -connect example.com:443

实用加密组合

基本写法:加密大文件(混合加密)

`# 1. 生成随机密钥
openssl rand -hex 32 > key.bin
# 2. 用 AES 加密文件
openssl enc -aes-256-cbc -salt -pbkdf2 -in largefile -out largefile.enc -pass file:./key.bin
# 3. 用 RSA 公钥加密密钥
openssl rsautl -encrypt -inkey public.key -pubin -in key.bin -out key.bin.enc
# 4. 删除原始密钥
rm key.bin`
# 混合加密大文件
openssl rand -hex 32 > key.bin
openssl enc -aes-256-cbc -salt -pbkdf2 -in largefile -out largefile.enc -pass file:./key.bin
openssl rsautl -encrypt -inkey public.key -pubin -in key.bin -out key.bin.enc
rm key.bin

基本写法:解密大文件

`# 1. 用 RSA 私钥解密密钥
openssl rsautl -decrypt -inkey private.key -in key.bin.enc -out key.bin
# 2. 用 AES 解密文件
openssl enc -d -aes-256-cbc -pbkdf2 -in largefile.enc -out largefile -pass file:./key.bin`
# 解密混合加密的大文件
openssl rsautl -decrypt -inkey private.key -in key.bin.enc -out key.bin
openssl enc -d -aes-256-cbc -pbkdf2 -in largefile.enc -out largefile -pass file:./key.bin

密钥派生

基本写法:使用 PBKDF2 派生密钥 openssl kdf -keylen <长度> -kdfopts pass:<密码>:salt:<盐>:iter:<迭代次数> PBKDF2

# 使用 PBKDF2 派生 32 字节密钥
openssl kdf -keylen 32 -kdfopts pass:password:salt:salt123:iter:100000 PBKDF2

基本写法:使用 scrypt 派生密钥 openssl kdf -keylen <长度> -kdfopts pass:<密码> scrypt

# 使用 scrypt 派生密钥
openssl kdf -keylen 32 -kdfopts pass:password scrypt