0

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

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

有一个 Web 服务,它具有用于返回各种敏感数据的各种方法。当用户使用的客户端首次连接到 Web 服务时,它通过身份验证方法进行连接,即

  1. 为该用户生成一个伪随机密钥
  2. 将该密钥保存在服务器上并将其返回给用户。

从客户端到 WS 的每个后续请求都需要uniqueCode和 密钥。如果该对有效,则请求返回所需的信息。如果 x 分钟内没有活动,则密钥无效,客户端要求用户再次登录。

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

我的选择

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

我的想法是正确的,还是我错过了什么?我认为最后一种方法是最安全的方法,因为如果有人可以访问我的系统,闯入 db 会很容易,但在不知道其他用户密钥的情况下破译文件将非常困难。

谢谢!

4

1 回答 1

1

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

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

如果不是,为什么不在你的应用程序中使用一些缓存和 Time To Live 呢?只需uniqueCode用作密钥,并将加密密钥用作值。流行的选择是:

  • 缓存
  • 番石榴缓存
  • 如果您不介意按时手动清理旧会话,HashMap则可以使用普通的旧会话。
于 2012-04-23T07:41:29.007 回答