【问题标题】:How to store server password in Java client for later reconnects?如何在 Java 客户端中存储服务器密码以供以后重新连接?
【发布时间】:2011-08-21 23:20:07
【问题描述】:

我有一个通过安全/SSL 套接字连接到服务器的客户端应用程序。用户需要在应用程序启动时登录。现在我有一个要求,我需要将实际密码发送到服务器(通过 SSL 加密),而不是发送密码哈希的首选方法。话虽如此,如果客户端由于连接丢失而需要在后台重新连接到服务器,我该如何将密码安全地存储在客户端内存中,以便我可以重新使用此密码?

我可以轻松地对密码进行加密,甚至可以将其放入 KeyStore 并稍后检索以重新连接,但是,即使我这样做,在我看来,如果黑客有权访问应用程序,他也可以检索密码在调试器中。当需要将密码临时存储在客户端上时,这只是生活中的事实吗?

是否有更好/首选的方法来实现相同的目标(即允许客户端重新连接到服务器,而无需用户在初始登录后再次输入密码)?从服务器发送的过期登录令牌会是更好的方法吗(我可以在重新连接时将此过期令牌而不是密码传递回服务器)?

最后,一般来说,当应用程序正确“去除”调试符号时,将调试器连接到 Java 桌面或 Android 上正在运行的应用程序有多容易?我什至需要担心这种情况,还是 Java 会保护我的交付应用程序免于附加调试器或其他内存分析器?

【问题讨论】:

    标签: java debugging passwords keystore


    【解决方案1】:

    如果黑客可以在调试器中访问应用程序,他就可以找回密码。

    正确。黑客还可以通过用肉眼越过用户的肩膀看用户打字来访问密码。

    并且黑客在他们将键盘记录器存储在用户计算机上后就可以访问。

    当人们需要将密码暂时存储在客户端上时,这只是现实吗?

    没有。

    另一种方法是您亲自拜访每个用户并告诉他们不要使用调试器来破坏安全性。

    让我们想想用户(知道密码)在调试器中启动应用程序以了解密码的用例。他们已经知道了。

    在考虑了用户启动在调试器下运行的客户端应用程序的唯一用例之后,我不确定安全性是否“被破坏”,因为他们已经知道密码。

    我想 Henry Hacker 可以在调试器中启动应用程序,通过关闭电源将其隐藏在另一个显示器上,然后运行以获取真实用户并让他们在开发工作站上输入密码已关闭其中一台显示器。这就是您所说的“在调试器中访问应用程序”的场景吗?

    我还需要担心这种情况吗,

    真的没有

    Java 是否会保护我的交付应用程序免于附加调试器或其他内存分析器?

    不,Java 不会保护您的用户。常识可以保护您的用户。

    如果调试器正在运行,它们不应该使用计算机。

    99% 的情况下,他们不会启动调试器。

    1% 的情况下,他们会意外运行调试器——因为用户点击随机图标。其中 1% 实际上会让您的应用程序在调试器下运行。同样,通过单击随机图标。其中 1% 的人实际上会通过点击屏幕上的随机图标进入他们可以输入密码的地方。

    可能用户可能会以某种方式在调试器下运行您的客户端。但。因为他们已经知道密码,所以担心它没有意义。


    这与中间人攻击或远程控制攻击完全不同。

    如果有人远程控制您用户的计算机、运行调试器并监视事务,那是完全独立的。这被防火墙和操作系统阻止了。不是 Java。


    将其放入 KeyStore 并稍后检索以重新连接

    这就是你所能做的。您的应用程序无法阻止“连接调试器”场景。提醒用户正在连接调试器是操作系统的工作。

    如果您担心责任,请不要存储密码。责任终止。

    【讨论】:

    • 调试器也可以用作病毒使用的 API,无需 GUI。
    • @S.Lott,我不同意,我认为这应该是一个问题(尽管对此无能为力)。你可以离开你的电脑,我带着调试器或内存分析器走
    • 如果用户离开他的办公桌,或者在移动的情况下,有人在应用程序登录时窃取了用户的手机,黑客就不能将调试器或内存分析器附加到已经运行的应用程序上吗?
    • @Android Dev:首先,黑客必须让用户离开他们的办公桌解锁。如果黑客可以做到这一点,他们可以绕过用户的肩膀,或者——更好的是——给用户买几杯饮料,然后通过这种方式获取密码。 “技术手段”是有限制的,在某些时候,你必须认识到社会工程的存在,并将胜过所有可能的以技术为中心的场景。有一个限制。
    • @SLott:如果我将我的 Android 手机留在餐厅并运行应用程序并且屏幕解锁,那么找到手机的人可以使用 DDMS 来转储所有内存并查看字符串。这就是我正在编写的这个金融应用程序中需要担心的问题。
    【解决方案2】:

    我会按照您的建议在服务器端创建某种会话令牌。将其与用户关联,并将其发送回客户端。

    取决于您所说的简单。我认为调试 Java 应用程序相当容易,即使它们没有调试符号。如果它们被混淆,甚至可以调试它们。

    【讨论】:

      【解决方案3】:

      您对应用程序中的(系统范围的)键盘记录器无能为力。因此将密码存储在内存中是有风险的,但比会话令牌风险小:

      黑客可以使用伪造 SSL/安全重新连接的恶意客户端并暴力破解令牌。与将密码存储在内存中相比,这种方法会带来更大的风险。

      【讨论】:

      • 我不明白为什么令牌比试图暴力破解密码的黑客更容易受到暴力破解?
      • 因为一般来说,令牌比密码更结构化。还;令牌按原样发送(因为它应该映射到服务器端的会话),而密码可以被散列(相同的密码映射到相同的“未知”数据;不太可预测)。另一个风险在于开发工作。必须创建一个会话和令牌认证层,而使用相对“简单”的密码技术需要较少的努力。假设程序员每 5 分钟引入一个错误。更少的实施时间意味着更少的错误。
      猜你喜欢
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 2015-05-15
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多