我已成功设置JJWT,以便在一系列Web服务的身份验证过程中使用。问题是它们是在一个Web服务中创建的,但是在多个服务之间进行了身份验证。如何成功安全地使用签名,同时确保我的所有Web服务都使用相同的签名来验证传入的JWT?
// 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();
答案 0 :(得分:1)
根据RFC 7518 - JSON Web算法(JWA):
与散列输出大小相同的密钥(例如,256位用于 " HS256")或更大版本必须与此算法一起使用。 (这个 要求基于第5.3.4节(HMAC的安全效果) 密钥)NIST SP 800-117(原文如此)[NIST.800-107],其中说明了 有效的安全强度是安全强度的最小值 密钥的大小和内部哈希值大小的两倍。)
您必须使用HS512至少512位的密钥。
需要随机选择密钥。您可以使用main()
或其他随机生成器生成密钥并将其分发到您的服务器(例如,以base64编码)
另一种方法是使用RSA密钥对。您使用私钥对令牌和公钥进行签名以进行验证。所有服务都可以安全地发布和使用公钥
另见https://security.stackexchange.com/questions/95972/what-are-requirements-for-hmac-secret-key