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

时间:2016-07-14 08:17:37

标签: authentication jwt jjwt

我正在阅读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未在第二个代码段上使用。怎么推断?或者没有必要吗?

2 个答案:

答案 0 :(得分:3)

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

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

eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.O8YgYdD1YxficWfO_06nDsm_YgDdXmgMM4CN3bLor5c

对应

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

答案 1 :(得分:2)

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

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

大多数解码器都支持这一点(如果他们不这样做,他们应该这样做)。

,你的具体例子似乎令人担忧
//OK, we can trust this JWT
如果您的解析器也接受alg=none,则

可能不正确。所以要小心!