在Web服务之间共享JJWT签名

在Web服务之间共享JJWT签名

问题描述:

我已经成功设置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(); 

根据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