【问题标题】:How to Create a JWT in Java with the secret base64 encoded如何使用秘密 base64 编码在 Java 中创建 JWT
【发布时间】:2020-01-22 11:35:54
【问题描述】:

使用在线 JWT 调试器对 JWT 令牌进行编码和解码,我创建了这个简单令牌

https://jwt.io/#debugger-io?token=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.5T7L_L1MPfQ_5FjKGa1fTPqrzwK4bNSM812nW6oyjb8

编码令牌的秘密是
qwertypassword

标题是{ "alg": "HS256"}

有效载荷是{ "sub": "admin", "aud": "Solr"}

当您使用非 base64 编码的密钥进行编码时,它会生成 JWT eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.5T7L_L1MPfQ_5FjKGa1fTPqrzwK4bNSM812nW6oyjb8

当秘密是 base64 编码时,它会生成 JWT eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.SWCJDd6B_m7xr_puQH-wgbxvXyJYXH9lTpldOU0eQKc

这里是生成 JWT 的 Java 代码,用于当密钥不是 base64 编码时。

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
public class JWTEncodeTest {
    public static void main(String[] args) {
        try {
            String secretkey="qwertypassword";

            //The JWT signature algorithm we will be using to sign the token
            String jwtToken = Jwts.builder()
                .setSubject("admin")
                .setAudience("Solr")
                .signWith(SignatureAlgorithm.HS256,secretkey.getBytes()).compact();

            System.out.println("jwtToken=");
            System.out.println(jwtToken);
        } catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
    }
}

我在这段 Java 代码中缺少什么来生成 JWT,其中秘密 base64 编码以生成 JWT 值

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.SWCJDd6B_m7xr_puQH-wgbxvXyJYXH9lTpldOU0eQKc

【问题讨论】:

标签: java jwt base64 jwt-auth


【解决方案1】:

jwt.io 上的secret base64 encoded 的含义实际上是,它将您提供的秘密视为base64encoded,因此在实际使用之前首先对其进行解码。重点不是创造任何不同的东西,而只是在编码时解码秘密。

很明显,您使用的秘密是未编码形式:

qwerty密码

当你对它进行 base64 编码时,例如。在https://www.base64encode.org/ 的帮助下,您可以将其作为 base64 编码 值:

cXdlcnR5cGFzc3dvcmQ=

jwt.io 上,您可以同时使用这两种形式:

  • 第一个,未编码带有base64 encoded secret 复选框未选中

  • 第二个,base64 编码,其中复选框已选中

在这两种情况下,您都会得到相同的结果。

对于您的 java 代码,在使用它进行签名之前,需要一个额外的步骤来解码编码的秘密:

import java.util.Base64;

String base64EncodedSecret = "cXdlcnR5cGFzc3dvcmQ=";
byte[] decodedSecret = Base64.getDecoder().decode(base64EncodedSecret);

然后,当您创建 JWT 时,您使用解码后的密钥:

.signWith(SignatureAlgorithm.HS256, decodedSecret)

但这只是必要的,如果您出于某种原因以编码形式获得秘密。

【讨论】:

  • 这根本不工作jwt.io/…令牌的JWT时endcoded检查该秘密的base64产生JWT令牌eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIiLCJleHAiOjE1NjkwMzY5NTl9.CTL0HdcqBtq5fS2Uf2M3UqIxmInAE24dzQ2ybIsOoO4的Java代码产生eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.5T7L_L1MPfQ_5FjKGa1fTPqrzwK4bNSM812nW6oyjb8 跨度>
  • 如果您真的想将qwertypassword 视为base64 编码值,那么只需将base64encodedSecret 变量的内容替换为quertypassword。但在我的回答中,我试图解释如何使用 base64 编码。我的重点不是重现将您的秘密视为 base64 编码的确切结果,因为它并不是真正的 base 64 编码值。只取一个随机字符串并说它是 base64 编码是没有意义的。因此,我向您展示了您的随机密钥在 base64 编码形式中的样子。请再仔细阅读我的回答。
  • 感谢这确实有效 String secretkey="qwertypassword"; byte[] decodeSecret = Base64.getDecoder().decode(secretkey); ... .signWith(SignatureAlgorithm.HS256,decodedSecret).compact();生成我期望的 JWT 密钥。
  • 最好打电话给.signWith(Keys.hmacShaKeyFor(decodedSecret))
  • 我想念这个选项,秘密 base64 编码。选中后,您在该框中输入的值将被 base64 解码。我反过来想。很高兴在这里找到讨论,并且已经投票了。
【解决方案2】:

根据 JPS 反馈,这是适用于我的解决方案的代码

import io.jsonwebtoken.SignatureAlgorithm;    
import io.jsonwebtoken.Jwts;
import java.util.Base64;


public class JWT {

    public static void main(String[] args) {
        try {
            String secretkey="qwertypassword";
            byte[] decodedSecret = Base64.getDecoder().decode(secretkey);

            //The JWT signature algorithm we will be using to sign the token
            String jwtToken = Jwts.builder()
                .setSubject("admin")
                .setAudience("Solr")
                .signWith(SignatureAlgorithm.HS256,decodedSecret).compact();

            System.out.println("jwtToken=");
            System.out.println(jwtToken);
        } catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
    }
}

JWT 键的值是预期的

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.SWCJDd6B_m7xr_puQH-wgbxvXyJYXH9lTpldOU0eQKc

那个网站 https://jwt.io/#debugger-io?token=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.5T7L_L1MPfQ_5FjKGa1fTPqrzwK4bNSM812nW6oyjb8

生产。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 2022-11-22
    • 2023-01-20
    • 1970-01-01
    • 2022-01-02
    • 2015-11-04
    • 1970-01-01
    相关资源
    最近更新 更多