我正在阅读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
未在第二个代码段上使用。怎么推断?或者没有必要吗?
答案 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
,则可能不正确。所以要小心!