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

我们知道我们可以用openssl使用这个命令encryption一个文件:

openssl aes-256-cbc -a -salt -in twitterpost.txt -out foo.enc -pass stdin 

密码将从标准input读取。 因此,事先提供密码,我们所需要做的就是预先安排

 echo "someGoodPassword" | 

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

我会很感激这个,所以我可以更好地理解这个问题。

几乎任何你使用的机制都会被root用户窥探,所以记住这一点。

echo选项将显示在' ps '列表中,这使得它对普通用户来说很容易被窃听并找到密码。

你可以使用-pass file:filename来使用一个文件,所以你可以使用:

 sumask=$(umask) umask 077 rm -f passfile cat >passfile <<EOM someGoodPassword EOM umask $sumask 

这将创建该文件,其他帐户无法读取(但仍可由root用户读取)。 一个假定脚本只用来创建密码文件,就好像你重复这个过程一样,它往往是在一个文件中,因此你需要chmod go-rwx这个文件使其他用户无法读取。

那么你使用:

 openssl aes-256-cbc -a -salt -in twitterpost.txt -out foo.enc -pass file:passfile 

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

其他机制是-pass env:ENVVAR用于使用一个环境变量(再次把它放在里面而不暴露它就是诀窍)

简洁版本

使用命名管道。

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

长版

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

 <( *output* ) 

例如

 <( echo -n "content" ) # without -n echo will add a newline 

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

 /dev/fd/63 

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

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

关于你的意见

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

如果您的计算机遭到黑客攻击并且攻击者拥有相同的用户权限,那么您已经完成了。 举个例子,攻击者可以很容易地修改你的.bashrc来替代openssl,这样在开始处理所有的事情之前,你就会开始一个假设的“恶意的openssl”来复制你的密码和数据,给你带来虚假的安全感。

这就是说,我不是一个安全专家,所以如果有人想让我陷入遗忘(并告诉我为什么),那么不用客气。

将密码放入bash或其他脚本文件中,并为其设置600个权限。 这将只允许您查看该文件,密码将不会显示在任何地方。

如果我理解正确的话,你的演唱会

 $ echo "someGoodPassword" | openssl (...) -pass stdin 

是密码将在进程列表中显示给所有用户很短的时间。 这可以很容易地解决与bash的<<<重定向(不会在普通的旧POSIX shell,但是):

 $ openssl (...) -pass stdin <<<"someGoodPassword" 

这个结构支持变量插值( <<<"$password" ),命令输出可以进一步传送或重定向到文件。