【问题标题】:Secure way to transmit and store data传输和存储数据的安全方式
【发布时间】:2014-05-06 18:36:54
【问题描述】:

我正在编写一个客户端服务器应用程序。客户端和服务器之间的通信使用 Java RMI。我已经设置 RMI 以便它使用SSLSockets,所以通信是安全的。但是现在我希望我的客户输入密码,密码需要发送到服务器并以安全的方式存储在那里。

  • 问题一:这个密码发送的时候需要加密吗,还是SSLSockets的使用就够了?

  • 问题 2:我正在考虑在服务器上使用哈希函数(如 SHA1)对其进行加密,然后将其与存储的值进行比较。

  • 问题 3:如何以安全的方式存储这些密码?我想将它们存储在本地。我应该创建一个数据库并存储加密的密码吗?这方面的常见做法是什么?

【问题讨论】:

  • 对Q2的备注:不应在客户端计算哈希,因为这会使哈希成为必须知道才能成功登录的秘密。相反,客户端发送密码,服务器计算哈希并将其与存储的值进行比较。
  • 当然,是的!我明白为什么,我要编辑我的问题
  • @Henry 另一个可行的选择是一次性会话密钥,但这可能有点过头了。

标签: java security encryption


【解决方案1】:

问题 1:

这取决于安全要求。大多数情况下就足够了。

问题 2:

在这里你可以找到一种计算SHA1字符串的方法:Java String to SHA1

问题 3:

在数据库的某个特定表中存储密码是一种很常见的做法。我建议使用散列密码和所谓的salt,所以协议是:

  • 用户正在注册或更改密码并向您发送他/她的密码。
  • 我们生成一些 looooooooong 随机字符串,我们将其用作盐。
  • 现在,我们需要计算数据库中的值。

假设您有执行哈希计算的sha1() 方法:

String salt = generateLongRandomString();
String hashToStore = sha1(sha1(password) + salt);
  • 现在,我们需要在数据库中为每个用户存储至少三个字段:username 或类似的东西,也许是email; hashToStore; salt;

好的,下一步是身份验证。

  • 用户想要进行身份验证并将其密码发送给您。
  • 您检索存储的该用户的哈希和盐,通过用户名或电子邮件进行搜索;
  • 您使用我上面写的公式重新计算哈希,并将其与存储的值进行比较。如果匹配,则该用户是真实的,您可以告知他/她。

【讨论】:

  • 我只是想本地存储,这里不需要特殊的硬件解决方案。我应该将加密数据存储在数据库中吗?
  • @JN11 我假设您说的是在本地或数据库中存储用户密码。如果这是真的,请更新您的问题 3 并告诉我,我会更新我的答案以包含有关该问题的最佳做法。
  • 是的,我想了解更多关于如何将数据库与 Java 一起使用
猜你喜欢
  • 2011-02-02
  • 1970-01-01
  • 2012-06-14
  • 2014-07-11
  • 2017-05-18
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多