2017-09-27 71 views
0

我已經成功設置JJWT以用於跨一系列Web服務的身份驗證過程。問題在於它們是在一個Web服務中創建的,但跨多個服務進行身份驗證。我怎樣才能成功和安全地使用簽名,同時確保我所有的Web服務使用相同的簽名來驗證傳入的JWT?在Web服務之間共享JJWT簽名

// We need a signing key, so we'll create one just for this example. Usually 
// the key would be read from your application configuration instead. 
Key key = MacProvider.generateKey(); 

String compactJws = Jwts.builder() 
    .setSubject("Joe") 
    .signWith(SignatureAlgorithm.HS512, key) 
    .compact(); 

我知道,我可以用一個普通的老字符串.signWith(Algorithm,String)但是我已經意識到,使用一個標準的Java String(直譯)是不夠安全。我是用一個類似於:

String compactJws = Jwts.builder() 
    .setSubject("Joe") 
    .signWith(SignatureAlgorithm.HS512, "shared complex passphrase") 
    .compact(); 

回答

1

根據RFC 7518 - JSON網絡算法(JWA):

大小相同的密鑰作爲哈希輸出(例如,256位 「HS256」)或更大必須與此算法一起使用。 (此 要求基於NIST SP 800-117(原文如此)的第5.3.4節(HMAC 鍵的安全影響),其中規定 有效安全強度是安全強度 的最小值密鑰和內部散列值大小的兩倍)。

您必須在HS512中使用至少512位的密鑰。

鑰匙需要隨機選擇。您可以使用MacProvider.generateKey();或其他隨機生成器生成密鑰並將其分發到您的服務器(例如,使用base64編碼)

另一種方法是使用RSA密鑰對。您使用私鑰簽署令牌和公鑰以進行驗證。公鑰可以安全地發佈和使用所有服務

另請參見https://security.stackexchange.com/questions/95972/what-are-requirements-for-hmac-secret-key