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