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
,则 可能不正确。所以保重!
我正在阅读 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
,则 可能不正确。所以保重!