openssl aes-256-cbc 加密对于异地备份是否安全

信息安全 openssl AES 备份
2021-08-13 08:38:38

我有大约 20000 个文件(大约 9GB),每个文件都使用openssl enc -aes-256-cbc -in infile -out outfile -k mypassword命令加密。每个文件使用相同的密码。我的 openssl 版本是1.1.0e.

如果我在异地位置备份这些文件,我是否容易受到任何已知的攻击?如果没有,我的替代方案是什么?

1个回答

您永远不应该使用 OpenSSL 的命令行实用程序进行通用加密。它实际上只是为了测试库的内部加密例程而设计的。因此,当需要真正的机密性和完整性时,使用它存在一些固有的问题:

  • 您将容易受到延展性攻击,因为 CBC 模式未经身份验证。这可以让您的文件在不知道加密密钥的情况下以某些可预测的方式进行修改。
  • 没有完整性检查意味着用错误的密钥解密可以成功,尽管输出损坏的乱码。为文件加密设计的实用程序会告诉您密钥是否错误。
  • 用于派生主密钥的默认哈希是 MD5,这远非理想。可以更改哈希,例如使用-md sha512,但它仍然不会使用密钥拉伸。
  • 默认情况下,新版本可能无法解密以前加密的文件。当默认哈希值从 MD5 更改为 SHA-512 时,它需要显式-md md5才能再次工作。
  • 密钥和 IV 都来自您输入的密码。使用相同的密码加密多个文件将导致 IV 重复使用。这对于 CBC 模式是不利的,对于 CTR 模式是致命的。
  • 它没有经过很好的测试。对于许多版本的 OpenSSL,enc使用 GCM 模式加密有效,但解密无效。甚至可能仍然如此。

这不是该enc命令独有的。当尝试将 OpenSSL 命令行实用程序用于测试库以外的任何事情时,它还有其他问题。另一个示例是s_client用于通过 SSL 或 TLS 连接到服务器的命令,它不会验证目标的证书。总的来说,您不应该使用 OpenSSL 实用程序只需使用 GnuPG:

唯一一次我会直接使用 OpenSSL 是如果我需要使用完全随机的密钥或特定的原始密钥和 IV 加密某些东西并且不关心消息完整性。例如,将内核播种的伪随机流写入标准输出可以通过以下方式完成:

openssl aes-128-ctr -nosalt -k $(xxd -l16 -c16 -ps /dev/urandom) -in /dev/zero

-md同样,当您知道原始密钥和十六进制原始 IV(绕过密钥派生的需要)时,可以通过以下方式解密一团纯加密数据:

openssl aes-128-cbc -d -nosalt -K $hex_key -iv $hex_iv -in infile -out outfile

但是对于通用文件加密呢?只需使用 GnuPG。