通过stdin安全地将密码传递给openssl

Enc*_*ada 15 unix security ssl openssl

我们知道我们可以使用此命令使用openssl加密文件:

openssl aes-256-cbc -a -salt -in twitterpost.txt -out foo.enc -pass stdin
Run Code Online (Sandbox Code Playgroud)

密码将从stdin中读取.因此,要提前提供密码,我们所需要的只是前置

echo "someGoodPassword" |
Run Code Online (Sandbox Code Playgroud)

到上面的命令.我的问题是:我怎样才能更安全地做到这一点?上述方法看起来不够安全.

我很感激对此的一些评论,所以我可以更好地理解这个问题.

Pet*_*esh 21

几乎任何你使用的机制都是root用户可以窥探的,所以请记住这一点.

echo选项将显示在' ps'列表中,使其易受普通用户窥探和查找密码的攻击.

您可以使用-pass file:filename文件,因此您可以使用:

sumask=$(umask)
umask 077
rm -f passfile
cat >passfile <<EOM
someGoodPassword
EOM
umask $sumask
Run Code Online (Sandbox Code Playgroud)

这会创建文件,其他帐户无法读取(但仍可由root读取).假设脚本仅用于创建密码文件一次,就像您重复该过程一样,它往往位于文件中,因此您需要chmod go-rwx该文件使其他用户无法读取.

然后你用:

openssl aes-256-cbc -a -salt -in twitterpost.txt -out foo.enc -pass file:passfile
Run Code Online (Sandbox Code Playgroud)

使用预先创建的密码文件执行加密.

其他机制是-pass env:ENVVAR使用环境变量(再次将其放在那里而不透露它是诀窍)

  • echo 不会出现在 `ps` 列表中,因为它是内置的(至少在 bash 中) (2认同)

Ric*_*lli 15

精简版

使用命名管道.

openssl aes-256-cbc -a -salt -in twitterpost.txt -out foo.enc -pass file:<( echo -n "someGoodPassword" )
Run Code Online (Sandbox Code Playgroud)

长版

使用命名管道.你可以用bash创建它

<( *output* )
Run Code Online (Sandbox Code Playgroud)

例如

<( echo -n "content" ) # without -n echo will add a newline
Run Code Online (Sandbox Code Playgroud)

它将打开一个命名管道,通常是一个FIFO队列,你会在进程列表中看到类似的东西

/dev/fd/63
Run Code Online (Sandbox Code Playgroud)

它只能由当前用户读取,并在读取后自动关闭,因此您不必担心权限和清理磁盘(如果程序崩溃,管道将关闭,而由你在另一个答案建议你会留在磁盘上).

这样它就会以最快的方式关闭,就在命令读取之后,而不是等待它完成任务(我只是做了一个测试:加密一些千兆字节并尝试读取命名管道(它在进程列表中可见) ):即使openssl需要很长时间才能加密,命名管道会立即关闭.

关于你的意见

如果计算机已被第二个应用程序破坏以获取此密码,则用户需要担心一些严重的安全问题.实际上,它可能是一些专门用于攻击我自己的软件的软件

如果您的计算机遭到黑客入侵且攻击者具有相同的用户权限,那么您就完成了.例如,攻击者可以轻松修改你的.bashrc以对openssl进行别名,这样它就会启动一个伪装的"evil-openssl"来复制你的密码和数据,然后再处理真正的openssl,让你产生错误的安全感.

那就是说,我不是安全专家,所以如果有人想要忘记我(并告诉我原因),那么欢迎你.


fir*_*iku 5

如果我没理解错,你的演唱会是关于

$ echo "someGoodPassword" | openssl (...) -pass stdin
Run Code Online (Sandbox Code Playgroud)

密码将在进程列表中对所有用户可见一段时间。这可以通过 bash 的<<<重定向轻松解决(但在普通的旧 POSIX shell 中不起作用):

$ openssl (...) -pass stdin <<<"someGoodPassword"
Run Code Online (Sandbox Code Playgroud)

此构造支持变量插值 ( <<<"$password"),并且命令输出可以像往常一样通过管道进一步传输或重定向到文件。