gpt4 book ai didi

java - NIO 客户端/服务器安全地验证凭据

转载 作者:太空宇宙 更新时间:2023-11-03 14:28:47 26 4
gpt4 key购买 nike

我使用受 SSL 保护的 Java NIO 连接客户端和服务器。要连接到服务器,系统会提示用户输入主机、端口、用户名和密码。到目前为止,我可以连接客户端和服务器(它们成功完成了它们的 SSL 握手),理论上我可以开始来回发送数据。我还没有编写验证登录凭据(用户名、密码)的机制。

服务器可以通过在数据库中查找用户名和密码来验证它们。如果客户端发送的凭据不正确,连接将被关闭。

问题 1:什么时候验证凭据?我假设这必须在 SSL 握手之后发生。

问题 2:如何在凭据序列化并发送到服务器之前安全地打包凭据?我想我应该散列密码。我也应该对用户名进行哈希处理吗?

像这样简单的东西就够了吗?

public class LoginCredentials implements Serializable {

private static final long serialVersionUID = 1026410425432118798L;

private final String username;
private final byte[] passwordHash;

public LoginCredentials(String username, byte[] passwordHash) {
this.username = username;
this.passwordHash = passwordHash;
}

public final String getUsername() {
return username;
}

public final byte[] getPasswordHash() {
return passwordHash;
}

}

问题 3:每个 session 都应该验证凭据,对吗?我读了一些帖子,这些帖子似乎表明应该为每个请求验证凭据。

问题 4:我应该使用哪种哈希算法? SHA–512 似乎很受欢迎。

最佳答案

  1. 当然在ssl握手之后,当ssl连接建立的时候,这样会更加安全
  2. 真正做到这一点的应用程序并不多,其中大多数只是通过 ssl 发送密码,根本不对其进行哈希处理。是的,你可以生成一个散列,但是散列应该为每次登录生成,所以它不会总是相同的,这需要客户端的一些代码来解决一些挑战,包括正确的密码和服务器发送的一些随机的东西,否则它与常规密码验证没有太大区别。但是有很多身份验证机制 - 密码、哈希、 token 、ssl 证书等等。
  3. 您需要检查经过身份验证的用户是否有权访问他尝试访问的资源 - 这是针对每个请求,如果您有 session ,则不需要为每个请求登录用户。如果您需要管理用户访问权限以在单个 session 期间授予或撤销访问权限,那么您需要读取每个请求的用户访问权限,如果您不需要这样的粒度,那么在整个 session 中读取一次就可以了。有时有无 session 服务,例如。一些 REST,那么通常您需要在每次调用时发送一些凭据。
  4. 您可以使用任何不太容易破译的哈希算法。

关于java - NIO 客户端/服务器安全地验证凭据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54543846/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com