2

我正在阅读jjwt库的概述:

构建令牌的过程如下:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.impl.crypto.MacProvider;
import java.security.Key;

// 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();

并且令牌被验证为:

try {

    Jwts.parser().setSigningKey(key).parseClaimsJws(compactJws);

    //OK, we can trust this JWT

} catch (SignatureException e) {

    //don't trust the JWT!
}

SignatureAlgorithm.HS512不用于第二个片段。它是如何推断的?还是没有必要?

4

2 回答 2

3

因为 JWT 在 header 中包含算法,所以验证器知道需要使用哪个算法,只需解码令牌的第一部分

例如,如果您解码此令牌的第一部分(在https://jwt.io/进行测试)

eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.O8YgYdD1YxficWfO_06nDsm_YgDdXmgMM4CN3bLor5c

对应于

{
  "alg": "HS512",
  "typ": "JWT"
}
于 2016-07-14T09:33:10.047 回答
2

正如@pedrofb 提到的,该算法方便地包含在标头中,如果是非对称算法,您还可以通过kid标头参数找到使用的密钥。

请注意,您应该非常小心,只允许在解码时使用您期望的算法。否则,您可能会接受一个用 签名的令牌alg=none,基本上绕过任何验证。

大多数解码器都支持这一点(如果他们不支持,他们应该)。你的具体例子虽然看起来令人担忧

//OK, we can trust this JWT

如果您的解析器也接受alg=none. 所以保重!

于 2016-07-15T09:10:53.517 回答