我根本看不到 openssl 命令行工具中的“-salt”如何增强安全性

信息安全 密码 AES openssl
2021-08-17 03:53:29

我这样做是为了加密单个文件:

openssl aes-256-cbc -a -salt -in file.txt -out file.enc

然后输入一些常规的明文密码。

我不明白如何-salt增强它的安全性。原因是盐存储在文件的开头,如下所示:

Salted__<eight salt bytes>

盐以如此明显的方式提供给饼干,它的目的是什么?我不知道它会如何使字典攻击更难......特别是考虑到据我所知,openssl只使用一次迭代从密码/盐生成 IV - 如果我错了,请纠正我。

2个回答

盐的重点是防止预计算攻击,例如彩虹表如果没有盐,任何人都可以生成一个庞大的哈希字典及其相关明文,并立即破解任何已知的哈希。对于盐,这样的字典是没有用的,因为为所有可能的盐生成这样的字典是不可行的。

我做了一篇非常深入的文章,涵盖了如何储存盐?,值得一读。

OpenSSL 结合使用盐和密码来生成两个值:IV 和实际的加密密钥。

  • 加密密钥必须从密码和文件头中存在的任何数据派生(因为我们希望能够仅在知道密码的情况下解密文件)。但是,我们不希望每次使用相同的密码时都获得完全相同的密钥,否则攻击者可能会尝试破解N个文件,而成本低于破解一个文件的N倍成本。成本分摊的一个例子是预计算表(密码到密钥映射表),彩虹表是预计算表的一个特例。

  • IV必须尽可能均匀随机同样,即使使用相同的密码加密,两个不同的文件也应该使用不同的 IV。一种可能的设计是在文件头中添加 IV(毕竟,IV 并不是要保密的——否则我们会称它为密钥,而不是 IV)。OpenSSL 开发人员更喜欢从密码中获取 IV,就像密钥一样(即他们从密码中生成一个长序列,他们将其分成两部分,一半是加密密钥,另一半是 IV)。这是有效的,只要在混合中添加了一些不同的元素,因为两个不同的文件必须具有不同的 IV。盐也这样做。

请注意,OpenSSL 使用的加密方法不是标准的;它是“OpenSSL 所做的”,但除了在 OpenSSL 源代码中之外,其他任何地方都没有记录。作为一种加密文件格式,它有点糟糕。特别是:

  • 似乎没有办法配置在密码到密钥派生中应该使用多少次迭代。这是一个问题,因为可配置的缓慢性对于解决密码的主要问题很重要,毕竟它们是密码,即在最好的情况下熵不太高的东西。

  • 加密系统不包括MAC,因此不一定会检测到更改(如果填充文件的最后两个块未修改,则根本不会检测到更改)

因此,如果可能,我们鼓励您使用更好的基于密码的文件加密工具。例如GnuPG