在Java WS中保存会话信息的位置

时间:2012-04-23 06:48:10

标签: java web-services encryption

我正在构建一个安全系统,必须确保发送消息的用户与接收到访问密钥的用户相同。实施例。

用户Bob拥有一个属性uniqueCode,这对他来说是唯一的,并且可以让他从服务器接收各种信息。

有一个Web服务,它有各种方法可以返回各种敏感数据。当用户首先使用的客户端连接到Web服务时,它通过authenticate方法执行此操作

  1. 为此用户生成伪随机密钥
  2. 将该密钥保存在服务器上并将其返回给用户。
  3. 从客户端到WS的每个后续请求都需要uniqueCode和密钥。如果该对有效,则请求返回所需信息。如果x分钟没有活动,则密钥无效,客户端要求用户再次登录。

    现在我的问题是,如何将密钥存储在服务器上?关键是Java对象,可以序列化。

    我的选择

    • 让他们参加会议。这是该公司的高级程序员所建议的,但这似乎不是可行的方法。我读到的每个地方都建议WS不应该依赖底层的HTTP会话。
    • 将它们保存在数据库中。一个可能的解决方案,但这需要我创建一个特定的数据库,为问题添加另一个层次。
    • 将它们保存在二进制加密文件中。这个似乎是要走的路,但是呢?由于我会在登录时生成密钥,因此我可以将密钥+一些信息保存在二进制文件中,自行加密,并将其传递给用户。如果我收到的密钥可以解密用户文件,并且信息正确,则返回用户请求的信息。

    我的想法是正确的,还是我错过了什么?我认为最后一个是最安全的方式,因为如果有人获得对我的系统的访问权限,那么破解数据库会很容易,但是在不知道其他用户密钥的情况下解密文件会非常困难。

    谢谢!

1 个答案:

答案 0 :(得分:1)

您是否需要保留密钥,以便在服务器重启后可用?

如果是,那么您必须将密钥保存在数据库中,或者保存在文件系统上,或者其他一些适合您的机制上。我会使用数据库 - 这样您就不会依赖文件系统,以防您移动应用程序,更改权限等。

如果不是,为什么不在应用程序中使用Time To Live的缓存?只需使用uniqueCode作为密钥,使用加密密钥作为值。热门选项是:

  • Ehcache
  • Guava Caches
  • 如果您不介意按时手动清理旧会话,可以使用普通的HashMap