Java 传输和存储数据的安全方式

Java 传输和存储数据的安全方式,java,security,encryption,Java,Security,Encryption,我正在编写一个客户机-服务器应用程序。客户端和服务器之间的通信使用JavaRMI。我已经设置了RMI,以便它使用SSLSockets,因此通信是安全的。但是现在我希望我的客户机输入密码,密码需要发送到服务器并以安全的方式存储在那里 问题1:发送此密码时是否需要加密,或者使用SSLSockets就足够了 问题2:我正在考虑在服务器上使用hashfunction(如SHA1)对其进行加密,然后将其与存储值进行比较 问题3:如何以安全的方式存储这些密码?我想把它们放在本地。我应该创建一个数据库并存储

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

  • 问题1:发送此密码时是否需要加密,或者使用
    SSLSockets
    就足够了

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

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


问题1:

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

问题2:

在这里,您可以找到一种方法来计算字符串的
SHA1

问题3:

在数据库中的某个特定表中存储密码是一种非常常见的做法。我建议将哈希密码与所谓的密码一起使用,因此协议为:

  • 用户正在注册或更改密码并向您发送其密码
  • 我们生成一些很长的随机字符串,我们将其用作盐
  • 现在,我们需要计算数据库中的值
假设您有执行哈希计算的
sha1()
方法:

String salt = generateLongRandomString();
String hashToStore = sha1(sha1(password) + salt);
  • 现在,我们需要在数据库中为每个用户存储至少三个字段:
    username
    或类似的内容,可能是
    email
    <代码>哈希存储<代码>盐
好的,下一步是身份验证

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

问题2的备注:不应在客户端计算哈希值,因为这将使哈希值成为成功登录所必须知道的秘密。相反,客户端发送密码,服务器计算散列并将其与存储值进行比较。当然,是的!我明白为什么,我要编辑我的question@Henry另一个重要的选择是一次性会话密钥,但这可能有些过分。我只想将其存储在本地,这里不需要特殊的硬件解决方案。我应该将加密数据存储在数据库中吗?@JN11我想您是说将用户密码存储在本地或数据库中。如果这是真的,请更新您的问题3并让我知道,我将更新我的答案,以包括关于这方面的最佳实践。是的,我想了解更多关于如何与Java一起使用数据库的信息