用户会话,用户名和登录

时间:2014-08-20 10:14:11

标签: java database sockets ssl username

我正在编写服务器/客户端应用程序。客户端通过SSL Socket通过单向SSL连接到服务器。服务器通过JDBC连接到数据库。该数据库将保存所有类型的数据,包括用户名(使用AES加密)和密码(使用BCrypt进行哈希处理)。

目前,客户端只是通过SSL连接,但不涉及用户名或密码。这就是我的计划问题所在。

客户端是桌面应用程序,理想情况下我希望允许用户在本地记住他们的凭据,因此每次启动客户端时,它都会自动连接到服务器而无需用户输入。在本地存储凭据最安全的方法是什么? AES和哈希再次?如果是这样,当通过套接字传输凭证时,我应该解密客户端并以简单(SSL)文本传输吗? (这对我来说听起来很阴暗,但可能是我缺乏经验)。

在服务器端(它使用cachedthreadpool进行多个连接),我将根据客户端的请求(它是一个厌食瘦客户端)执行很多不同的功能。这可以是数据库数据检索和中继,复杂模拟和返回结果,以及不同用户共享信息的白板功能。理想情况下,我希望服务器保留一个关于谁登录的选项卡(例如,能够为白板功能广播数据)。我想它可以被认为是会话管理功能。关于如何执行此操作,我有点迷失,因为我读过的所有文档都会在每次事务后关闭套接字,因此无法发送广播信息。

我理解这可能是一个非常广泛的问题,但现在服务器和客户端正在互相交谈,我想确保他们所说的协议得到妥善规划。

提前致谢!

1 个答案:

答案 0 :(得分:0)

您不必在AES之后使用Hash。只要确保你改变了钥匙。一种方法是使用用户自己的密码或用户ID和密码的组合作为密钥。这样,每个用户的结果都会有所不同。还要确保使用Java属性“user.home”存储结果。这将确保只有用户和管理员才能访问存储加密密码的位置。

要密切关注用户,请不要在每次交易后关闭套接字。将套接字存储在Map中,以便可以轻松检索广播以及直接消息传递。您只需要确保每个插槽1个线程上发生套接字通信。如果丢失连接,您还需要能够终止套接字,因为用户可以在不通知服务器的情况下关闭应用程序。

或者你可以使用java.nio和channels在单个线程中执行这些操作,因为nio可以配置为非阻塞。

凭借我们现在拥有的强大CPU,许多人认为线程方法比使用通道更具性能和可扩展性。