0

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

1 回答 1

1

根据RFC 7518 - JSON Web 算法 (JWA):

此算法必须使用与散列输出大小相同的密钥(例如,“HS256”为 256 位)或更大的密钥。(此要求基于 NIST SP 800-117(原文如此)[ NIST.800-107 ] 的第 5.3.4 节(HMAC 密钥的安全效果),其中规定有效安全强度是安全强度的最小值键和内部哈希值大小的两倍。)

HS512 必须使用至少 512 位的密钥。

密钥需要随机选择。您可以使用或其他随机生成器生成密钥MacProvider.generateKey();并将其分发到您的服务器(例如以 base64 编码)

另一种方法是使用 RSA 密钥对。您使用私钥对令牌进行签名,使用公钥进行验证。所有服务都可以安全地发布和使用公钥

另请参阅https://security.stackexchange.com/questions/95972/what-are-requirements-for-hmac-secret-key

于 2017-09-29T06:06:04.620 回答