简单示例

假设 fileB 包含以下内容:

Hello, World!

运行命令:

openssl enc -aes-256-cbc -in fileB -out encryptedB -pass pass:mypassword123

加密后,encryptedB 是一个二进制文件,内容以 Salted__ 开头,后面是随机盐值和加密数据。
你可以用 hexdump 查看(仅用于调试):
   
   
hexdump -C encryptedB
   

解密

要解密 encryptedB,使用以下命令:

openssl enc -aes-256-cbc -d -in encryptedB -out decryptedB -pass pass:mypassword123

-d 表示解密。
-out decryptedB 是解密后的输出文件。
使用相同的密码 mypassword123
如果密码正确,decryptedB 将恢复原始内容 Hello, World!

注意事项

1. **
密码安全**:
   
选择强密码(至少 12 字符,包含字母、数字、符号)。

   
不要在命令行直接写密码(因为会被记录在 shell 历史记录中)。可以交互式输入:
       
       
openssl enc -aes-256-cbc -in fileB -out encryptedB
       
       
运行后会提示输入密码两次(加密时需要确认)。
2. **
盐值**:
   
默认情况下,OpenSSL 会添加随机盐值,增加安全性。

   
如果不想要盐值(不推荐),可以用 -nosalt
       
       
openssl enc -aes-256-cbc -in fileB -out encryptedB -pass pass:mypassword123 -nosalt
       
3. **
算法选择**:
   
-aes-256-cbc 是常见选择,但 OpenSSL 支持其他算法(如 -aes-128-cbc-des)。查看支持的算法:
       
       
openssl enc -ciphers
       
4. **
文件覆盖**:
   
确保 encryptedB 不覆盖现有文件,OpenSSL 不会提示覆盖。

5. **
密码存储**:
   
记住密码!如果忘记密码,文件将无法解密。

改进:使用文件存储密码

为了避免在命令行暴露密码,可以将密码存储在文件中(例如 passfile):

echo -n "mypassword123" > passfile openssl enc -aes-256-cbc -in fileB -out encryptedB -pass file:passfile

-pass file:passfile 从文件中读取密码。

加密后,保护好 passfile(例如删除或设置严格权限)。

简单总结

这条命令用 AES-256-CBC 算法加密 fileB,生成 encryptedB,并使用你指定的密码 yourpassword。解密时使用相同密码即可恢复文件。确保密码安全,并根据需要选择交互式输入或文件存储密码以提高安全性。
默认情况下,openssl enc 使用简单的密钥派生方法(通常基于 MD5,仅单次迭代),容易受到暴力破解攻击。

为提高安全性,添加 -pbkdf2 和 -iter 和 -md sha256 参数:

openssl enc -aes-256-cbc -in fileB -out encryptedB -pass pass:mypassword123 -pbkdf2 -iter 100000  -md sha256

参数说明
-pbkdf2:使用 PBKDF2 算法进行密钥派生,提升安全性。
-iter 100000:设置 100,000 次迭代,增加破解难度。可根据性能和安全需求调整次数。
-md sha256 指定哈希算法。
-salt:默认启用随机盐值(推荐),增强加密安全性,通常无需显式指定。
兼容性:如果需要在较旧的 OpenSSL 版本(例如 1.1.0 之前)解密,-pbkdf2 可能不被支持,需测试兼容性。
密码强度:加密安全性依赖于密码(mypassword123)。建议使用更复杂、唯一的密码。

解密验证

openssl enc -aes-256-cbc -d -in encryptedB -out decryptedB -pass pass:mypassword123 -pbkdf2 -iter 100000  -md sha256


安全建议
使用强密码:将 mypassword123 替换为更复杂的密码,或使用密钥文件(-pass file:keyfile)。
备份文件:加密前确保备份 fileB,以防意外丢失。
考虑替代工具:现代工具如 gpg 或 age 可能提供更高的安全性和便利性。
性能权衡:较高的 -iter 值会增加加密/解密时间,需根据需求平衡。
推荐做法

为了最大程度确保加密和解密的兼容性,遵循以下建议:

尽量使用相同或相近版本:
理想情况:加密和解密使用完全相同的 OpenSSL 版本(例如 3.2.0)。
次优选择:使用同一主版本系列(如 1.1.x 3.x),因为同一系列的兼容性更高。
例如,加密用 1.1.1,解密用 1.1.2 几乎无问题;加密用 3.0.0,解密用 3.2.0 也很安全。

升级到最新版本:

建议使用 OpenSSL 3.x 系列(截至 2025 4 月,最新为 3.3.2),因为它们:
提供更现代的安全默认值。
修复了 1.1.x 的已知漏洞。
增强了对 PBKDF2 和元数据的支持。
3.x
向下兼容 1.1.0 及以上生成的加密文件(前提是参数一致)。

记录加密环境:


保存加密时的 OpenSSL 版本、参数(-aes-256-cbc-pbkdf2-iter 100001)和密码。
例如,记录为:Encrypted with OpenSSL 3.2.0, AES-256-CBC, PBKDF2, iter=100001, md=sha256
测试跨版本兼容性:

如果计划在不同版本上解密,提前在目标环境测试。例如,加密后将文件传输到解密设备,运行解密命令,检查是否成功。
如果失败,检查版本差异或尝试升级解密环境的 OpenSSL

考虑认证加密:


AES-CBC
模式不提供完整性验证,建议考虑 AES-GCM(认证加密)以提高安全性:
openssl enc -aes-256-gcm -in fileB -out encryptedB -pass pass:mypassword123 -pbkdf2 -iter 100001 -md sha256
解密:
openssl enc -aes-256-gcm -d -in encryptedB -out decryptedB -pass pass:mypassword123 -pbkdf2 -iter 100001 -md sha256

GCM
模式需要 1.1.0 或更高版本,且 3.x 版本支持更稳定。