【问题标题】:How can I encrypt or hide passwords in a Perl script?如何在 Perl 脚本中加密或隐藏密码?
【发布时间】:2010-10-10 22:00:41
【问题描述】:

我正在编写使用 Expect 通过 telnet 登录到远程机器的 Perl 脚本(不要问,必须使用 telnet)。我还根据需要执行 p4 登录操作,并使用 expect 来输入正确的密码。现在我只是从明文环境变量中读取密码,即export PASSWORD=password,我知道这在安全方面并不好。

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

请记住,我无法轻易更改现有系统,例如我无法真正安装 SSH 或类似的东西。

【问题讨论】:

  • 您要防御哪些类型的威胁?您在多大程度上信任(或不信任)您正在开发的机器上的其他用户?
  • 我只是开始编写这个脚本,出于测试目的,我将它作为纯文本。所以有共享用户,盒子在许多用户之间共享。所以主要是我希望其他用户至少不能随便阅读所有密码。

标签: perl encryption passwords expect


【解决方案1】:

如果您使用的是 Mac OS X,我找到了this nifty way to grab usernames and passwords from your Keychain

更新:截至 2013 年 7 月 22 日,该链接似乎已损坏。以下 bash 代码 sn-p 显示了我如何使用该技术(下载 iTunes 销售数据):

domain="itunesconnect.apple.com"
user="user@example.com"
pass=$(security find-internet-password -ws $domain -a $user)

【讨论】:

    【解决方案2】:

    我喜欢已经提到的将密码放在单独文件中的解决方案。此外,您可以散列实际密码,就像在 /etc/passwd 中所做的那样。尽管您可能对所有这些都使用相同的哈希键,具体取决于您的应用程序。显然,这样做的缺点是有人必须输入哈希键才能运行您的脚本,而这在批处理环境中不起作用。

    从这个stackoverflow question开始学习散列的一个地方

    【讨论】:

      【解决方案3】:

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

      这听起来像是试图在窗户上放上铁条,然后让门一直开着。

      【讨论】:

      • 这是一个很好的观点,我意识到使用 telnet 是个坏主意,当然不是我的,但我并没有这么想。所以你真的是认真的,我不应该关心吗?我想我必须关心代码审查等,但有趣的想法仍然存在。
      • 在代码中记录原因,推动流程更改,并在代码中记录。加密密码,然后通过 telnet 从脚本发送明文,就像使用代码写下您的 PIN 码,然后对着满是您不认识的人的房间大喊大叫。
      • 虽然我同意 telnet,但仅仅因为前门上的锁坏了并不意味着您移除了所有窗户上的锁。当你最终修好前门锁时会发生什么?
      • 当然有一个平衡点。在我看来,这听起来像是一家有着系统性不良做法的商店,试图在问题上撒一点小精灵尘埃,然后就结束了。这就是为什么我提倡记录问题,并明确它们的相互关系。只有这样你才能修复它们。
      • 评估问题在分段交换网络中嗅探密码的范围。不是微不足道的,所以我认为脚本中使用的加密密码仍然有帮助。我确实赞成您的回答,这当然让我思考。删除所有 telnet 可能是一项非常昂贵的工作(数百万)。
      【解决方案4】:

      之前有一个非常相似的问题,请参阅my answer

      简而言之,人类必须启动信任链。其他一切都是混淆视听。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • +1 这是唯一合乎逻辑的解决方案,除非您想走“通过默默无闻的安全”路线。
        • @lacqui - 您可以在 XS 中编写 (en|de)cryption 代码并编译它,并通过 Perl 与它交互,并且(出于安全考虑)不使用标准模块分发分发 XS 源代码。但即使这样也不完美。
        【解决方案6】:

        由于您已经在使用 expect,您应该考虑能够在包含您的密码的加密文件上重定向 gpg -d。在系统环境变量中存储密码是完全错误的。用于解密 gpg 文件的密码将在启动时输入,然后从文件中加载所有密码并运行您的东西。然后你就完成了,所以密码只在应用程序运行时以明文形式存在。

        编辑 顺便说一句,将任何密码放在脚本中都是不好的;请记住,该脚本只是一个纯文本文件,它可以让您轻松查看该密码。同样,即使您编译的应用程序也可以用“字符串”反转,它可以查找代码中包含的字符串(通常是密码)。

        【讨论】:

        • 所以我假设您的意思是“GNU Privacy Guard”,它看起来并不存在于我们的机器上,据您所知 gpg 在 HPUX 和 Solaris 上编译没问题?
        • 我不确定 GPG 是否有 Solaris 和 HPUX,但是如果它们是基于 *nix 的机器,那么我确信它有来源。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多