我使用受 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:每个会话都应该对凭据进行一次身份验证,对吗?我阅读了一些似乎表明应该为每个请求验证凭据的帖子。
问题 4:我应该使用哪种哈希算法?SHA-512 似乎很受欢迎。