2012-04-23 29 views
0

我在构建一个安全系统,必须确保发送消息的用户与接收密钥相同。例。在哪里使用Java保存会话信息WS

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

有一个web服务,它有各种方法来返回各种敏感数据。当用户第一次使用客户端连接到Web服务,它通过身份验证方法确实是这样,那

  1. 生成该用户
  2. 伪随机密钥保存在服务器上的密钥,并将其返回到用户。

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

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

我选择

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

我的想法是正确的,还是我错过了什么?我认为最后一个将是最安全的方法,因为如果有人能够访问我的系统,闯入数据库将很容易,但在不知道另一个用户密钥的情况下解密文件将非常困难。

谢谢!

回答

1

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

如果是的话,那么你必须保持密钥在数据库,文件系统或其他一些适用于你的机制。我会使用数据库 - 这样,如果您移动应用程序,更改权限等,则不依赖于文件系统。

如果不是,那么为什么不只是在应用程序内部使用一些带有Time To Live的缓存?只需使用uniqueCode作为密钥,并使用加密密钥作为值。流行的选择是:

  • Ehcache
  • Guava Caches
  • 如果你不介意的清洗旧会话时间手动,一个普通的老HashMap可以做的。
+0

是的,这将是可取的,并有助于提高可用性。在旁注中,如果我需要保留的密钥是一个对象,如何将它存储在MySQL数据库中?序列化,加密,然后存储为一个blob? – 2012-04-23 07:50:57

+0

@JanisPeisenieks如果关键字有一些文本形式,你可以使用它而不是序列化和blob,这将更容易处理。至于加密,这取决于你 - 如果你担心有人可能会损害你的数据库,那么这样做 - 但是在那一点上,无论如何你都会有比用户会话更大的担心。 – jmruc 2012-04-23 07:58:50

+0

好的,谢谢,总是很高兴听到重申。 – 2012-04-23 08:11:56