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

时间:2019-02-05 22:11:07

标签: java ssl nio java-security sslengine

我使用受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似乎很受欢迎。

1 个答案:

答案 0 :(得分:0)

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