簡體   English   中英

NIO客戶端/服務器安全地驗證憑據

[英]NIO Client / server securely authenticate credentials

我使用受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. 當然,在ssl握手之后,當ssl連接建立時,這使其更安全
  2. 實際上,執行此操作的應用程序並不多,大多數應用程序只是通過ssl發送密碼,而根本不會對其進行哈希處理。 是的,您可以生成一個哈希,但是哈希應該為每次登錄生成,因此它不會總是相同的,這需要客戶端上的一些代碼來解決一些挑戰,其中包括正確的密碼和服務器發送的一些隨機密碼,否則與常規密碼身份驗證沒有太大區別。 但是,這里有很多身份驗證機制-密碼,哈希,令牌,ssl證書等等。
  3. 您需要檢查經過身份驗證的用戶是否有權訪問他嘗試訪問的資源-這是針對每個請求的,如果您有會話,則不要為每個請求登錄該用戶。 如果需要管理用戶訪問權限以在單個會話期間授予或撤消訪問權限,則需要讀取每個請求的用戶訪問權限,如果不需要這種粒度,則可以在整個會話中讀取一次。 有時有無會話服務,例如。 一些REST,那么通常您需要在每次調用時發送一些憑證。
  4. 您可以使用任何不太容易解密的哈希算法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM