NIO客户端/服务器安全的身份验证凭据

问题描述 投票:0回答:1

我使用Java NIO确保通过SSL连接的客户端和服务器。要连接到用户被提示输入主机,端口,用户名和密码的服务器。到目前为止,我可以连接客户端和服务器(他们成功地完成自己的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似乎是非常受欢迎的。

java ssl nio java-security sslengine
1个回答
0
投票
  1. 当然是SSL握手,当建立SSL连接后,这使得它更安全
  2. 不是很多应用程序真正做到这一点,他们大多只是通过SSL不散列它在所有发送的密码。是的,你可以生成一个散列,而是应该为每个登录时产生的哈希值,所以它不会总是相同的,这需要在客户端的一些代码来解决一些挑战,其中包括正确的密码和一些随意的事情由服务器发送,否则它不会不同于常规密码认证得多。但有大量的认证机制 - 密码哈希,令牌,SSL证书仅举几例。
  3. 你需要检查验证的用户有权访问他试图访问的资源 - 这是每个请求,而不是登录用户为每个请求,如果您有会话。如果您需要管理授予或撤销单个会话期间访问用户的访问权限,那么你需要阅读用户的访问权限为每一个请求,如果你不需要这样的粒度,然后阅读他们曾经为整个会话确定。有时,无会话服务,例如。一些休息,那么通常你需要发送在每次调用一些凭证。
  4. 你可以使用任何哈希算法,这不是太容易破译。
© www.soinside.com 2019 - 2024. All rights reserved.