use*_*041 8 encryption passwords openssl salt
使用OpenSSL加密文件时,可以使用-pass pass:mySillyPassword,其中mySillyPassword是加密中使用的密码.此外,可以使用盐,其中-salt -s(十六进制字符串)用于指定盐.
为什么有人想要使用密码而不是盐或与盐一起使用?另外,我理解只使用-salt命令会导致OpenSSL生成salt.这比用户定义的盐更好吗?如果OpenSSL随机生成一个salt,那么用户将来如何知道解密文件的盐是什么?
小智 8
Password和SALT是两个不同的东西。您必须有一个带或不带盐的密码(密码是强制性的,而盐是可选的,但建议使用)。
key用于加密的实际值由password和驱动SALT(如果提供)。因此,即使使用相同的密码加密两个文件,如果使用 SALT,那么密钥也会不同,密文当然也会不同。
密码永远不会附加或编码到密文中。相反,盐被添加到密文的开头。但没有密码就不能用它来解密密文。
为什么盐很重要?想象一下,您使用相同的密码(不使用 SALT)来加密 10 个文件。攻击者可以为潜在密码生成密钥字典,然后一旦一个密钥成功解密一个文件,它就可以解密所有文件。对于 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
Run Code Online (Sandbox Code Playgroud)
两个密文应该相同,因为加密密钥仅取决于密码,而密码在两种情况下都是相同的。
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?(.......$..
Run Code Online (Sandbox Code Playgroud)
密码和盐:
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
Run Code Online (Sandbox Code Playgroud)
即使我们使用相同的密码,由于 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..
Run Code Online (Sandbox Code Playgroud)
在OpenSSL中,盐将放在加密数据的前面,这样就可以对其解密。盐的目的是防止字典攻击,彩虹表等。以下内容来自OpenSSL文档:
如果没有-salt选项,则可以对密码执行有效的字典攻击并攻击流密码加密的数据。原因是没有盐,相同的密码始终生成相同的加密密钥。使用盐时,将为盐保留加密数据的前八个字节:加密文件时会随机生成该盐,解密后会从加密文件中读取该盐。
该文档建议,除非必须与不支持盐的早期版本兼容,否则盐始终应与密码一起使用。
| 归档时间: |
|
| 查看次数: |
9647 次 |
| 最近记录: |