jwt:为什么验证JWT令牌时不需要签名算法?

jwt: Why is signature algorithm not needed when verifying a JWT token?

我正在阅读 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 未用于第二个代码段。它是如何推断的?还是没有必要?

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

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

eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.O8YgYdD1YxficWfO_06nDsm_YgDdXmgMM4CN3bLor5c

对应于

{
  "alg": "HS512",
  "typ": "JWT"
}

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

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

大多数解码器都支持此功能(如果不支持,也应该支持)。你的具体例子虽然看起来令人担忧

//OK, we can trust this JWT
如果您的解析器也接受 alg=none,则

可能不正确。所以保重!