OpenSSL - 密码与盐目的
Posted
技术标签:
【中文标题】OpenSSL - 密码与盐目的【英文标题】:OpenSSL - Password vs Salt Purpose 【发布时间】:2013-06-22 06:25:57 【问题描述】:使用 OpenSSL 加密文件时,可以使用 -pass pass:mySillyPassword,其中 mySillyPassword 是加密时使用的密码。此外,还可以使用盐,其中 -salt -s(十六进制字符串)用于指定盐。
为什么有人要使用密码而不是盐或与盐结合使用?另外,我知道仅使用 -salt 命令会导致 OpenSSL 生成盐。这比用户定义的盐有什么好处?如果OpenSSL随机生成一个salt,以后用户怎么知道salt是什么来解密文件?
【问题讨论】:
【参考方案1】:在 OpenSSL 中,盐将被添加到加密数据的前面,这将允许对其进行解密。 salt的目的是防止字典攻击、彩虹表等。以下来自OpenSSL文档:
如果没有 -salt 选项,可以高效地执行 字典攻击密码和攻击流密码 加密数据。原因是没有盐一样 密码始终生成相同的加密密钥。当盐是 正在使用的加密数据的前 8 个字节被保留 对于盐:它是在加密文件时随机生成的,并且 解密时从加密文件中读取。
文档建议始终将盐与密码一起使用,除非需要与不支持盐的早期版本兼容。
【讨论】:
谢谢你的解释,但我还是不明白密码的用途。这是 OpenSSL 文档所说的: pass:password 实际密码是密码。由于密码对实用程序可见(如 Unix 下的 'ps'),这种形式只应在安全性不重要的情况下使用。密码如何存储在加密数据中?是不是也附上了?密码似乎不是很安全,但我想只有在数据被加密时该人有权访问计算机才重要,对吗? 是的,您是对的,只有在加密或解密时存在对计算机的访问权限时,密码才会以这种方式泄露。但是,当它说“这种形式只应在安全性不重要的情况下使用”时,它意味着用于指定密码的语法 (pass:password
)。相反,您应该使用其他方法,例如file:pathname
或stdin
。不,没有附加密码。密码用于生成解密文件的密钥,并且只能使用该密码进行解密。密码是安全的,但前提是使用得当。
谢谢,这样就更清楚了。此密码用于生成密钥 - 密码文件是单独生成的文件吗?如果不是,我认为它很像盐。我希望文档更具体。
您可以在命令行或文件中提供密码。密码和盐的区别在于密码是秘密的,而盐不是。
加密文件的目的是隐藏其内容。因此,您必须提供密码或加密密钥。 (如果您提供密码,该密码将用于生成加密密钥,然后用于加密或解密您的信息)。因此,要回答您的问题,不,我无法提供您只使用盐的情况的示例。【参考方案2】:
Password
和 SALT
是两个不同的东西。您必须有一个带或不带盐的密码(密码是强制性的,而盐是可选的,但建议使用)。
用于加密的实际key
来自password
和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 而不同。请注意,盐被附加到密文的开头。
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..
【讨论】:
【参考方案3】:SALT 对于不使用 openssl/GPG 解密您的密文的对手非常重要。 当匹配密码(不是密钥)时,使用 openssl 的字典攻击将解密所有使用此密码加密的文件,同意吗? 攻击者的主要目标是了解加密标准(aes、des 等)。
【讨论】:
【参考方案4】:使用 SALT,它只能提高一点点安全性:如果黑客可以找到一个加密文件的密码,并且如果用户对所有文件使用相同的密码,无论是否使用 SALT,黑客将能够解密所有文件,无论它们是否具有不同的 SALT。
【讨论】:
以上是关于OpenSSL - 密码与盐目的的主要内容,如果未能解决你的问题,请参考以下文章