关于加密:如何在Perl脚本中加密或隐藏密码?

How can I encrypt or hide passwords in a Perl script?

我正在研究Perl脚本,它使用Expect通过telnet登录到远程机器(不要问,必须使用telnet)。我还根据需要执行P4登录操作,并使用Expect-to管道输入正确的密码。目前,我只是从明文环境变量(即export PASSWORD=password)中读取密码,我知道这是不明智的安全措施。

对于需要多个系统的大量密码的脚本,存储密码的最佳方法是什么?以某种方式在文本文件中加密?或者别的什么?

请记住,我不能轻易地更改现有系统,例如,我不能真正安装ssh或类似的东西。


也许你最好的方法是把密码放在一个单独的文件中,并锁定该文件的安全性,这样只有你有读取权限。不幸的是,如果您在脚本中存储加密的密码,您还必须存储解密方法,这样攻击者就可以运行解密并恢复您的密码。


前面有一个非常相似的问题,看我的答案。

简而言之,人类必须摆脱信任链。其他的一切都令人困惑。


如果使用telnet,为什么要担心脚本中的密码?一个假定的攻击者会发现,从网络上捕获数据比从远程机器上捕获更容易,也更容易,而且在任何情况下您都无法对其做任何处理。

这听起来像是一个试图把栅栏放在窗户里,让门摇摆不定的例子。


当你使用MacOSX的时候,我发现了从你的钥匙链中获取用户名和密码的好方法。

更新:截至2013年7月22日,链接似乎已断开。下面的bash代码片段显示了我如何使用该技术(下载iTunes销售数据):

1
2
3
domain="itunesconnect.apple.com"
user="[email protected]"
pass=$(security find-internet-password -ws $domain -a $user)


既然您已经在使用expect,那么您应该考虑在包含密码的加密文件上重定向gpg-d。在系统环境变量中存储密码显然是错误的。用于解密GPG文件的密码将在开始时输入,然后从文件中加载所有密码并运行您的资料。然后就完成了,所以密码只在应用程序运行时以明文形式存在。

编辑就像旁注一样,在脚本中输入任何密码都是不好的;请记住,脚本只是一个纯文本文件,这使得查看密码变得非常容易。同样地,即使您编译的应用程序也可以使用"字符串"进行反转,该字符串可以查找代码中包含的字符串(通常是密码)。


我喜欢前面提到的将密码放在单独文件中的解决方案。此外,您还可以散列实际密码,就像/etc/passwd中所做的那样。尽管根据应用程序的方式,您可能会对所有的哈希键使用相同的哈希键。显然,这种方法的缺点是,必须有人输入hashkey才能运行脚本,而这在批处理环境中是行不通的。

从这个stackoverflow问题开始学习散列技术