gpt4 book ai didi

Java - Auth0 JWT 验证 - 这是否正确?

转载 作者:行者123 更新时间:2023-12-01 11:20:01 28 4
gpt4 key购买 nike

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

我的实现基于示例代码 here (RS256 部分)和 here .唯一的修改是我投了 PublicKeyRSAPublicKey .

问题是我想肯定验证会在签名错误时失败。我更改了签名的最后一个字符(我们会说“x”)并且 token 仍然经过验证。 但是 - 将其切换为除“x”或最初生成的字符以外的任何字符会导致它按预期失败。

我怀疑这是由于某种填充/编码/解码/Base64 问题,而我只是碰巧选择了一个具有相同前 n 位位数之类的字符?当然,这意味着如果要进行成功的“猜测”,则需要包括 token 剩余的 40 亿个字符——这是它存在的全部意义。所以我并不一定担心 token 是可猜测的——我只是确保我已经正确地实现了验证的要点。

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();
}

}
}

最佳答案

看看 JWT example (截图如下)。

token 有 3 个不同颜色的部分:

  • 标题 :关于 token 的元数据,包括使用的算法。未签名,未验证。
  • 有效载荷 : token 的内容(用户声明)。签名并验证。
  • 签名 : token 的签名。

  • 尤其是 header 没有签名,它们几乎可以包含任何内容并且可以更改。尽管 token 如果被破坏(例如错误的算法值)将无法被解码。

    有一些规则可以将所有这些数据编码、填充和序列化,请参阅规范。可以在 token 中添加/删除/编辑几个字节并仍然具有有效 token ,尽管略有不同(修改的填充或标题)。但是,无法更改 token 的有效负载,这一点很重要。

    JWT 库提供单独的函数来从 token 中提取信息,例如 get_unverified_headers()get_claims() ,避免任何潜在的混淆。假设有人不小心从 header 而不是有效载荷中读取了用户标识符,这将是一个严重漏洞,因为它可以自由更改。

    sample of JWT token

    关于Java - Auth0 JWT 验证 - 这是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45581290/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com