OpenSSL - 密码与盐目的

时间:2013-06-25 12:41:19

标签: encryption passwords openssl salt

使用OpenSSL加密文件时,可以使用-pass pass:mySillyPassword,其中mySillyPassword是加密中使用的密码。此外,可以使用盐,其中-salt -s(十六进制字符串)用于指定盐。

为什么有人想要使用密码代替盐或与盐一起使用?另外,我理解只使用-salt命令会导致OpenSSL生成salt。这比用户定义的盐更好吗?如果OpenSSL随机生成一个salt,那么用户将来如何知道解密该文件的盐是什么?

3 个答案:

答案 0 :(得分:5)

在OpenSSL中,salt将被添加到加密数据的前面,这将允许它被解密。 salt的目的是防止字典攻击,彩虹表等。以下内容来自OpenSSL文档:

  

如果没有-salt选项,则可以高效执行   字典攻击密码和攻击流密码   加密数据。原因是没有盐相同   密码始终生成相同的加密密钥。当盐是   正在使用加密数据的前八个字节是保留的   对于salt:它在加密文件时随机生成   解密后从加密文件中读取。

文档建议salt始终与密码一起使用,除非必须与不支持salt的早期版本兼容。

答案 1 :(得分:0)

PasswordSALT是两件事。您必须具有带或不带盐的密码(密码是必填项,盐是可选的,但建议使用)。

用于加密的实际keypasswordSALT(如果提供)驱动。因此,即使使用相同的密码来加密两个文件,如果使用了SALT,那么密钥也将有所不同,并且密文当然也是如此。

密码永远不会附加或编码到密文中。相反,将盐添加到密文的开头。但是没有密码就不能用于解密密文。

为什么SALT很重要?想象一下,您使用不带SALT的相同密码来加密十个文件。对手可以生成潜在密码的密钥字典,然后一旦一个密钥成功解密了一个文件,就可以解密所有文件。使用SALT,他必须为每个SALT创建十个不同的字典,这对他来说使事情变得更昂贵,对我们而言也更安全。

让我们做一些实际的事情,我将使用openssl 1.1.1:

没有SALT的密码:

echo "secret data in my file" > plaintext.txt

openssl enc -aes-128-cbc -nosalt -k "mySecretPassword" -in plaintext.txt -out enc1.nosalt.bin
openssl enc -aes-128-cbc -nosalt -k "mySecretPassword" -in plaintext.txt -out enc2.nosalt.bin

两个密文都应该相同,因为加密密钥仅取决于密码,在两种情况下都相同。

xxd enc1.nosalt.bin
00000000: 576e a82c 0dac 92d8 5e45 5ef4 3f6f db6a  Wn.,....^E^.?o.j
00000010: 5630 554f 3f28 a0de ae96 91d9 1024 d5ca  V0UO?(.......$..

xxd enc2.nosalt.bin
00000000: 576e a82c 0dac 92d8 5e45 5ef4 3f6f db6a  Wn.,....^E^.?o.j
00000010: 5630 554f 3f28 a0de ae96 91d9 1024 d5ca  V0UO?(.......$..

密码和SALT:

openssl enc -aes-128-cbc -k "mySecretPassword" -in plaintext.txt -out enc2.salted.bin
 openssl enc -aes-128-cbc -k "mySecretPassword" -in plaintext.txt -out enc1.salted.bin

即使我们使用相同的密码,由于SALT,密文也应该有所不同。请注意,Salt附加在密文的开头。

xxd enc2.salted.bin
00000000: 5361 6c74 6564 5f5f 9cfe 2d62 a2d4 70b8  Salted__..-b..p.
00000010: aee4 afb5 85c9 76a2 cb04 7e1d 27d9 94d4  ......v...~.'...
00000020: a1b3 c4d6 39b8 f5a8 c300 81b5 b6ed 4cca  ....9.........L.

xxd enc1.salted.bin
00000000: 5361 6c74 6564 5f5f e73c ee5b 701b bba8  Salted__.<.[p...
00000010: fa25 c54e befa 26dc ddb1 3a2d 2bd7 a95b  .%.N..&...:-+..[
00000020: bda9 56f0 4445 f229 3398 4076 1044 dad6  ..V.DE.)3.@v.D..

答案 2 :(得分:0)

对于不使用openssl / GPG解密密文的对手,SALT非常重要。 当与密码(不是密钥)匹配时,使用openssl的字典atack将解密使用该密码加密的所有文件,同意吗? 对手的主要目标是了解加密标准(AES,DES等)。