我正在编写服务器/客户端应用程序。客户端通过 SSL 套接字通过一种方式连接到服务器。服务器通过 JDBC 连接到数据库。该数据库将保存各种数据,包括用户名(使用 AES 加密)和密码(使用 BCrypt 散列)。
目前,客户端只是通过 SSL 连接,不涉及用户名或密码。这就是我的计划问题所在。
客户端是一个桌面应用程序,理想情况下我希望允许用户在本地记住他们的凭据,这样每次他们启动客户端时它都会自动连接到服务器而无需用户输入。在本地存储凭据的最安全方法是什么?又是 AES 和哈希?如果是这样,在通过套接字传输凭据时,我应该解密客户端并以纯文本(SSL)传输吗? (这对我来说听起来很阴暗,但这可能是我的经验不足)。
在服务器端(它为多个连接使用缓存线程池),我将根据客户端请求执行很多不同的功能(这是一个厌食症瘦客户端)。这可以是数据库数据检索和中继、复杂模拟和返回结果以及供不同用户共享信息的白板功能。理想情况下,我希望服务器保留一个关于谁登录的标签(例如,为了能够为白板功能广播数据)。我想它可以被视为 session 管理功能。我有点不知道如何做到这一点,因为我阅读的所有文档都会在每次交易后关闭套接字,因此无法发送广播信息。
我知道这可能是一个非常宽泛的问题,但既然服务器和客户端正在相互交谈,我想确保他们使用的协议(protocol)得到妥善规划。
提前致谢!
最佳答案
您不必在 AES 之后使用 Hash。只要确保您改变 key 即可。一种方法是使用用户自己的密码或用户 ID 和密码的组合作为 key 。这样每个用户的结果都会不同。还要确保使用 Java 属性“user.home”存储结果。这将确保只有用户和管理员才能访问存储加密密码的位置。
要密切关注用户,不要在每次交易后关闭套接字。将套接字存储在 Map 中,以便可以轻松检索它以进行广播以及直接消息传递。您只需确保套接字通信发生在每个套接字的 1 个线程上。如果失去连接,您还需要能够终止套接字,因为用户可以在不通知服务器的情况下关闭应用程序。
或者,您可以使用 java.nio 和 channel 在单个线程中执行这些操作,因为 nio 可以配置为非阻塞的。
如今,我们拥有强大的 CPU,许多人认为线程方法比使用 channel 具有更高的性能和可扩展性。
关于java - 具有用户名和登录名的用户 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25402162/