在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