java - 如何在 Java 客户端中存储服务器密码以供以后重新连接?

标签 java debugging passwords keystore

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

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

是否有更好/更可取的方法来实现同样的事情(即允许客户端重新连接到服务器而无需用户在初始登录后再次输入密码)?从服务器发送的过期登录 token 是否是更好的方式(我可以在重新连接时将此过期 token 而不是密码传递回服务器)?

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

最佳答案

a hacker could retrieve the password if he had access to the application in a debugger.

正确。当黑客通过用他们的实际眼球查看用户的物理肩膀来观察用户类型时,他们也可以访问密码。

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

Is this just a fact of life when one needs to store the password on the client for a temporary time?

没有。

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

让我们考虑一下用户(知道密码)在调试器中启动应用程序以获取密码的用例。他们已经知道了。

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

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

Do I even need to worry about this case,

不是真的

or will Java protect my shipping application from having a debugger, or other memory analyzer, attach to it?

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

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

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

1% 的时间,他们会不小心运行调试器——因为用户单击随机图标。其中 1% 实际上会让您的应用程序在调试器下运行。同样,通过单击随机图标。在这 1% 的用户中,他们实际上会通过点击屏幕上的随机图标进入可以输入密码的位置。

用户可能会以某种方式在调试器下运行您的客户端。但。由于他们已经知道密码,因此无需担心。


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

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


put it into a KeyStore and retrieve it later for the reconnect

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

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

关于java - 如何在 Java 客户端中存储服务器密码以供以后重新连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5942039/

相关文章:

在 jvisulavm 中添加 JMXConnection 时出现 java.lang.SecurityException

C - 使用 getchar() 读取意外字符

java - HtmlUnit 无法自动登录网站

java - JanusGraph 添加边缘似乎不起作用

java - p4 更改为 P4Java 的等效项

debugging - ltrace 和 gdb 附加到同一进程

powershell - Security.SecureString参数不接受字符串

c# - 存储全局/共享应用程序登录名/密码的常用方法有哪些?

java - 设计模式: Callback as a method parameter

java - 在运行时运行已编译的 java 代码