首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java - Auth0 JWT验证-这是正确的吗?

Java - Auth0 JWT验证-这是正确的吗?
EN

Stack Overflow用户
提问于 2017-08-09 03:36:45
回答 1查看 2.8K关注 0票数 7

我正在使用Auth0作为身份验证服务来设置REST。一切正常,但我的信心在一次相当奇怪的事件之后有一点动摇。

我的实现基于示例代码这里 ( RS256部分)和这里。唯一的修改是将PublicKey转换为RSAPublicKey

问题是,我想肯定的是,如果签字不对,核查就会失败。我更改了签名的最后一个字符(我们会说"x"),令牌仍然被验证。但是-将它切换到除"x“或最初生成的字符之外的任何字符都会导致它如预期的那样失败。

我的怀疑是,这是由于某种填充/编码/解码/ same 64问题,我只是碰巧选择了一个字符的第一个n位数或其他什么?当然,这意味着如果要进行一个成功的“猜测”,就需要包含标记的其余40个--卡比拉字符--这就是它存在的全部意义。因此,我不必担心令牌是否可以猜测--我只是确保正确地实现了验证的要点。

代码语言:javascript
运行
复制
import com.auth0.jwk.Jwk;
import com.auth0.jwk.JwkException;
import com.auth0.jwk.JwkProvider;
import com.auth0.jwk.UrlJwkProvider;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.security.interfaces.RSAPublicKey;

public class Application {
    public static void main(String[] args) {

        try {
            JwkProvider provider = new UrlJwkProvider("<my-provider>");
            Jwk jwk = provider.get("<my-key-id>");

            String token = "<some-token-passed-from-client>";
            RSAPublicKey publicKey = (RSAPublicKey) jwk.getPublicKey();

            Algorithm algorithm = Algorithm.RSA256(publicKey, null);
            JWTVerifier verifier = JWT.require(algorithm)
                    .withIssuer("<my-issuer>")
                    .build();
            DecodedJWT jwt = verifier.verify(token);

        } catch (JWTVerificationException exception) {
            System.out.println("JWT Exception: " + exception.getMessage());
        } catch (JwkException e) {
            e.printStackTrace();
        }

    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-05-08 19:17:22

只看一下JWT示例 (下面的截图)。

令牌有三个单独颜色的部分:

  • Header:关于令牌的元数据,包括所使用的算法。没有签名也没有核实。
  • 有效负载:令牌的内容(用户声明)。签名和核实。
  • 签名:令牌的签名。

特别是头部没有签名,它们可以包含几乎任何内容并被更改。尽管如果令牌是边界的,它将无法被解码(例如,糟糕的算法值)。

有规则,编码,垫和序列化所有这些数据在一起,参考规范。可以在令牌中添加/删除/编辑几个字节,并且仍然有一个有效的令牌,尽管略有不同(修改的填充或标头)。但是,不可能更改令牌的有效负载,这才是最重要的。

JWT库提供了从令牌(如get_unverified_headers()get_claims() )提取信息的独立函数,避免了任何潜在的混淆。假设如果有人意外地从报头而不是有效负载中读取用户标识符,这将是一个关键的漏洞,因为这可以自由更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45581290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档