为什么 openssl aes-256-cbc 输出文件中的哈希文件总是不同?

为什么 openssl aes-256-cbc 输出文件中的哈希文件总是不同?

我尝试使用此命令加密文件:

openssl enc -aes-256-cbc -in $infile -out $outfile -pass file:$keyfile

对于同一个输入文件,为什么输出文件有不同的哈希值。

答案1

加拿大广播公司需要一个:第一个数据块应该是随机的。它与数据一起发送,以便接收者拥有解密消息所需的信息。CBC 的 IV 应该是均匀随机不可预料的。该openssl enc命令创建一个包含 8 个固定字节和 8 个随机字节的 IV(应该是 16 个随机字节)。当您对同一条消息加密两次时,IV 会发生变化。(有一个选项是-nosalt使用固定 IV,这对安全性来说更糟糕,除非密码本身是为单个消息随机生成的,否则不应该这样做。)

所有未被破解的加密模式都有一个 IV 或等效项,因此加密同一条消息两次会产生不同的密文。这至少是必要的,因为这样攻击者就无法检测出两条加密消息是否具有相同的明文。对不同的消息重复 IV 可能会引发其他攻击;例如,使用 CBC,如果重复使用 IV,则两条消息的公共前缀在密文中可见。如果您发现加密同一条消息两次会产生相同的密文,则说明存在问题。

不要使用该openssl命令进行严肃的工作。它只是用来展示库函数的,而且就连这一点来说,它的设计也很糟糕。正如我们所见,enc由于它的 IV 不够随机,因此该命令不能完全安全地执行操作。更糟糕的问题是密钥从密码中派生的方式:openssl enc使用单轮 MD5,这很糟糕——从密码派生密钥应该使用一个本质上很慢的函数(按键拉伸功能) 来减缓攻击者尝试可能的密码(字典单词、1337 个变体等)的暴力破解尝试。

主要的用户级加密工具是通用石油气,在 Ubuntu 中可用格努普或者格努普包。要使用密码加密文件,请使用

gpg -c filename

系统将提示您输入密码。加密文件将存储在 中filename.gpg。要解密,请运行gpg filename.gpg并输入密码。

答案2

(我认为您-d在问题的命令中意外添加了解密选项。)

加密文件因随机 64 位而不同加密盐OpenSSL 默认生成并包含在每个加密文件中。可以使用选项禁用此功能-nosalt,但正如 OpenSSL 文档中man enc所述,这通常是一个非常糟糕的主意:

-salt如果密钥是从密码派生出来的,则应始终使用该选项,除非您希望与 OpenSSL 和 SSLeay 的先前版本兼容。

如果没有该-salt选项,则可能对密码执行有效的字典攻击并攻击流密码加密数据。原因是如果没有盐,相同的密码总是会生成相同的加密密钥。使用盐时,加密数据的前八个字节将保留为盐:它是在加密文件时随机生成的,并在解密时从加密文件中读取。

相关内容