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 为您提供安全性的尝试被浪费了。
正在尝试使用 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 为您提供安全性的尝试被浪费了。