Openssl passin 抛出 "Bad password read"

Openssl passin throws "Bad password read"

正在尝试使用 openssl 加密文件并使其可执行。找到了一个有趣的 link 适合我的一个问题。这是“我必须在 openssl 命令中传递用于加密的密码”,这是导致错误的结果。

创建 编写脚本 (script-base.sh)

#!/bin/sh 
echo "Hello World" 

加密你的脚本(给个密码):foobar是我的密码

openssl enc -e -aes-256-cbc -a -in script-base.sh > script-enc 

Write de Wrapper (script-final.sh):

#!/bin/sh 
openssl enc -d -aes-256-cbc -a -in script-enc | sh -passin pass:foobar

运行 "script-final.sh" 我在控制台中看到以下错误

enter aes-256-cbc decryption password: bad password read

尽管以下代码有效但已弃用

openssl enc -d -aes-256-cbc -a -in script-enc -k foobar | sh -

使用时抛出以下错误

*** 警告:已弃用密钥派生。 使用 -iter 或 -pbkdf2 会更好。 解密错误

... works but [] deprecated: openssl enc -d -aes-256-cbc -a -in script-enc -k foobar | sh -

在这种情况下,您将 -k foobar 作为 openssl enc -d 命令的选项,因此它被用作解密的密码,因为您实际上使用 [=14= 进行了加密,所以它会成功] 作为密码(以及相同的密码和默认 KDF)。请参阅下文了解弃用。

openssl enc -d -aes-256-cbc -a -in script-enc | sh -passin pass:foobar [gives]
enter aes-256-cbc decryption password: bad password read

这里你没有把 -passin pass:foobar 作为 openssl 的选项,你把它作为 shell 的选项是管道的第二个组件。由于您没有将密码作为参数提供给 openssl 并且需要它,openssl 提示您输入它,但您没有提供有效输入(可能输入 control-D 或类似的)所以它失败了。如果你这样做了

openssl enc -d -aes-256-cbc -a -in script-enc -passin pass:foobar | sh 

它与 -k 版本完全 相同,除了在您的脚本中使用更多 space。

openssl enc 长期使用(且仍默认)的 key-derivation 确实很差很弱,几十年来一直受到广泛批评; OpenSSL 1.1.1(2018 年发布,在您 link 回答的日期之后)及更高版本最终提供了一种更好的 -pbkdf2 方法,并警告使用旧方法。但是,您应该在加密端而不是解密端注意此警告;一旦你用糟糕的方法加密,你必须用它来解密(并遭受警告)。另请注意,正如我在 link 评论的那样,OpenSSL 1.1.x(和 3.0)与早期版本不兼容,因此如果您或任何人(如您的用户)想要任何系统要处理的是 运行 较旧的软件,它会失败。

或者,考虑使用一开始就设计得当的东西,例如 Gilles 在回答同一问题时推荐的 GPG(一年多以前)。尽管 GPG(取决于版本)使得在命令行上提供密码变得不那么方便,因为这通常会导致密码被泄露——但在您的情况下,您已经自己泄露了密码,因此 GPG 为您提供安全性的尝试被浪费了。