【问题标题】:Java - Securely store user account details required for use in codeJava - 安全地存储在代码中使用所需的用户帐户详细信息
【发布时间】:2011-06-18 04:36:57
【问题描述】:

我正在构建一个与 Web 服务交互的应用程序。为了使用该网络服务,我必须使用我的实际用户名和密码登录 - 没有其他方法可以使用该服务。

我不想在我的详细信息中硬编码,如下所示:

String username = "MyUsername";
String password = "MyPassword";

我曾想过加密细节并将它们存储在一个文件中,但即便如此,任何有编程经验的人都可以通过查看我的源代码轻松恢复信息:

File f = load("mydetails.txt");
String[] = recoverDetails(f); //or something like that

我存储这些信息的最安全方式是什么?

【问题讨论】:

  • 您的应用程序(使用 Web 服务的应用程序)是您分发给用户的东西,还是您在自己的服务器上运行的 Internet 应用程序?

标签: java security passwords


【解决方案1】:

如果您真的希望它们安全,则必须将它们锁定在加密安全的“保险库”文件中。某人(您或信任的人,但在此合适)会提供解锁保险库的密钥(基本上是另一个密码),然后您的软件将能够访问存储在其中的信息。

如果没有人知道启动应用程序的秘密,那么就真的没有任何方法可以完全隐藏信息。这只是一个简单的现实事实,许多人(如 DVD 联盟)难以否认,后果自负。

【讨论】:

    【解决方案2】:

    将其存储在一个文件中,但将该文件设置为只读且只能由服务进程读取。

    如果您想放弃您的应用程序,则无法以无法恢复登录信息的方式保护它。对不起。

    通常这是通过提供服务器端安全性以及为您的公共 API 的每个用户提供自己的凭据来处理的。就像谷歌地图,你必须得到一个特殊的密钥并使用它来使用 API,所以谷歌可以跟踪你是否以合法的方式使用 API。

    【讨论】:

      【解决方案3】:

      您没有提及代码的部署位置。如果您的应用程序在您客户的机器上运行并直接发出 Web 服务请求,则无法阻止某人获取凭据。即使您对它们进行了加密,应用程序也必须能够使它们可用,因此解密密钥必须对其可用,从而对您的用户可用。即使您可以安全地加密它,用户也有其他方法,因为它是他们的盒子,例如嗅探出站网络流量。

      如果进行 Web 服务调用的代码在您的服务器上,那么您会遇到同样的问题,但至少可以控制环境。在某些时候,服务器必须将加密的凭据呈现为可用的形式以发出 Web 服务请求,因此您可以加密 Web 服务凭据,但代码必须有密码或证书才能访问它们。除非每次都有人在附近输入证书的密码,否则这一切只是嵌套凭据,但不能保护它们。

      这个问题的答案当然不是试图解决代码中不安全的 Web 服务需求的问题。要么找到一个您可以调用的更安全的等效 Web 服务(可能使用 API 密钥和用户自己的凭据或生成安全令牌),要么游说 Web 服务提供商以正确的方式进行操作。看看 Twitter 和 Facebook 在安全方面的所有最新进展 - 用户需求会产生影响。

      【讨论】:

        【解决方案4】:

        既然您建议人们将能够看到您的代码,我猜他们也将能够在他们的硬件上运行该软件(这意味着他们有 root 权限并且任何只读限制最终都会失败)。

        我能想到的唯一安全方法如下:

        • 让自己在智能卡上获得电子签名
        • 用你的公钥加密密码并保存

        这样,使用您的凭据的唯一方法是使用私钥解密它们,该私钥以只读方式存储在您的卡上,并通过附加密码(PIN 码)访问。

        正如 Pointy 提到的,如果没有人为因素持有秘密(私钥的 PIN 码和智能卡的物理所有权),就无法确保信息 100% 安全。

        【讨论】:

          【解决方案5】:

          您应该使用散列函数,并且您的数据库密码不应以明文形式存储,而应以散列值形式存储。然后您只需将哈希提供给数据库,并且其中还有一个哈希,您无需担心。

          但是,如果您必须在程序中使用明文,那么具有调试器的攻击者可以在您将用户名和密码的值提供给数据库的那一刻找到它们。更重要的是,外部攻击者可以使用嗅探工具(例如,wireshark)观察您的网络,如果您使用不安全的网络协议,则只需获取值。因此,完全不建议在您的程序流程中使用任何明文用户名密码对。

          无论如何,如果你必须这样做,最好和最安全的方法是加密你的用户名/密码对,当它们被发送到服务器时,你应该解密它们并将它们作为服务器赢得的明文发送'不懂加密。但是,如果您对服务器有任何访问权限,也许您应该稍微修改一下,这样它就不会将密码存储为明文。

          干杯。

          【讨论】:

            【解决方案6】:

            正如其他人所指出的,没有什么神奇的方法可以隐藏您的密码(这在逻辑上是不可能的,参见 DVD 复制保护),但是您应该采取一些安全预防措施来最大程度地减少损坏的可能性。

            如果您不控制服务器(例如,您在共享主机上运行您的应用程序),那么:

            • 确保您正在登录的 Web 服务帐户(使用 MyUsername/MyPassword)仅具有此应用所需的最低权限。
            • 仅将此帐户用于一个部署(这样,如果它曾经被入侵,您可以锁定此帐户而不影响其他应用程序/安装)。

            如果你确实控制了服务器,那么另外:

            • 保护服务器,即正常的系统管理任务,例如防火墙、安装最新补丁、监控日志等。

            【讨论】:

              猜你喜欢
              • 2023-02-22
              • 1970-01-01
              • 1970-01-01
              • 2014-06-08
              • 2017-01-01
              • 1970-01-01
              • 2017-10-02
              • 2012-04-03
              • 1970-01-01
              相关资源
              最近更新 更多