2011-06-12 105 views
8

通过密码OpenSSL的,我们知道我们可以使用此命令加密使用OpenSSL文件:安全地通过stdin

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

的密码会从标准输入读取。因此,为了事先提供密码,我们需要做的只是前面的

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

我很感激这方面的一些评论,所以我可以更好地理解这个问题。

回答

13

几乎所有你使用的机制都会被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使用环境变量(再一次得到它在那里没有透露它的伎俩)

+0

因此,如果我有一些软件让用户在某个用户界面中键入密码,然后将此密码写入此文件(使用正确的权限),然后它调用这些终端命令,您会说是安全的?从这个意义上说:如果计算机已被第二个应用程序入侵以获取此密码,那么该用户有一些严重的安全问题需要担心。实际上,它可能是一些专门用来攻击我自己软件的软件:)你对此有何想法? – Enchilada 2011-06-12 13:06:19

+1

这会让事情变得相对安全,但是如果有专门设计来攻击你的程序的应用程序,那么所有的投注都关闭 - 我们可以在输入密码时窥探键盘,我们可以读取I/O,因为文件是正在写入,我们可以读取文件,我们可以读取您的环境。几乎没有保护是100%安全的 - 您可以使用'打开文件,取消链接,但保持文件句柄打开并传递句柄'技巧,因此文件系统上没有密码跟踪(使用fd:number作为参数-pass)使用UI的应用程序也使用fd – Petesh 2011-06-12 19:43:48

+1

如果这是gnome中桌面应用程序的一部分,则可以使用gnome-keyring作为密码的安全存储位置,因为它是加密的并且通常不可访问当用户没有登录时(KDE有kwallet IIRC)。 Adobe AIR应用程序也有一个密码存储机制(我不知道AIR的安全机制),但由于您使用的是shell脚本语法,因此我认为这些并不是真正的选择。 – Petesh 2011-06-12 19:57:10

1

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

11

短版

使用命名管道。

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 

它会打开一个命名管道,通常是一个FIFO队列,您将在进程列表类似

/dev/fd/63 

看到这将是仅可由当前用户,将被自动关闭读取完成后,您不必担心权限并清理磁盘(如果程序崩溃,管道将关闭,而由另一个应用程序建议的由您创建的文件将保留在磁盘上)。

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

您的意见

如果计算机已经被第二应用程序损害获得此 密码,那么用户有一些严重的安全问题担心 有关。其实,这可能是一些软件专门用来攻击 我自己的软件

如果您的计算机被黑客入侵和攻击者的相同的用户权限,你就完了。举个例子,攻击者可以很容易地修改你的.bashrc到别名openssl,这样它就可以开始一个假设的“evil-openssl”来复制你的密码和数据,然后把所有的东西都交给真正的openssl,给你带来虚假的安全感。这就是说,我不是安全专家,所以如果任何人想让我陷入遗忘(并告诉我为什么),那么不用客气。

0

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

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

是,密码会在进程列表中的所有用户的时间短一些量可见。可以很容易地使用bash的<<<重定向周围的工作(不会在普通的旧POSIX壳工作,虽然):

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

此构造支持可变插值(<<<"$password")和命令输出可以进一步管道或重定向到文件照常。