我们知道我们可以用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"
),命令输出可以进一步传送或重定向到文件。