当前位置: 首页 > 知识库问答 >
问题:

jjwt中,如何反向解码base64编码后的key呢?

习华灿
2024-09-01

官网中有这么一段:
If you need to save this new SecretKey, you can Base64 (or Base64URL) encode it:

String secretString = Encoders.BASE64.encode(key.getEncoded());
链接:https://github.com/jwtk/jjwt?tab=readme-ov-file#creating-safe-keys

问题来了,如何反向解码呢?知道了String类型的secretkey,如果转变成SecretKey类型呢?
大概过程我能想到,是Decoders.BASE64.decode(secretString),但是后面想不到了,有谁知道吗?

共有2个答案

小牛22974
2024-09-01

这下面不就是吗

SecretKey key = Keys.hmacShaKeyFor(Decoders.BASE64.decode(secretString));

image.png

  • SecretKey Formats
刘翔宇
2024-09-01

在JJWT库中,当你需要将Base64编码的密钥字符串转换回SecretKey对象时,你需要先解码该字符串为字节数组,然后使用该字节数组来创建或恢复SecretKey对象。这里的关键在于,你需要知道原始的密钥是什么类型的(例如,AES密钥通常是一个SecretKeySpec的实例)。

以下是一个基于假设原始密钥是AES密钥的示例步骤,来展示如何从Base64编码的字符串中恢复SecretKey对象:

import io.jsonwebtoken.security.Keys;
import io.jsonwebtoken.SignatureAlgorithm;
import java.security.Key;
import java.security.spec.SecretKeySpec;
import java.util.Base64;

public class SecretKeyExample {

    public static void main(String[] args) {
        // 假设这是你从某处获取的Base64编码的密钥字符串
        String secretString = "这里应该是你的Base64编码的密钥字符串";

        // 使用Base64.Decoder来解码字符串
        byte[] decodedBytes = Base64.getDecoder().decode(secretString);

        // 如果原密钥是AES密钥,那么你需要创建一个SecretKeySpec实例
        // 注意:这里的"AES"是算法名称,"256"是密钥长度(根据你的密钥而定,可能是128、192或256)
        SecretKeySpec secretKey = new SecretKeySpec(decodedBytes, "AES");

        // 现在你可以使用这个secretKey作为JWT签名的密钥了
        // 例如,创建一个Signer
        Key key = secretKey; // SecretKey实现了Key接口

        // 使用这个密钥进行JWT的签名或验证等操作...
        // 注意:这里只是展示了如何恢复密钥,并没有实际进行JWT操作
    }
}

请注意,上面的示例中,"AES""256"应该根据你的实际密钥类型和长度进行调整。如果你不确定密钥的算法和长度,你可能需要查阅生成密钥时的相关代码或文档。

另外,虽然JJWT库提供了EncodersDecoders类用于Base64编码和解码,但Java的java.util.Base64类同样可以用来完成这个任务,并且它是Java标准库的一部分,因此不需要额外依赖。在上述示例中,我使用了java.util.Base64来解码Base64字符串。

 类似资料:
  • 介绍 Base64编码是用64(2的6次方)个ASCII字符来表示256(2的8次方)个ASCII字符,也就是三位二进制数组经过编码后变为四位的ASCII字符显示,长度比原来增加1/3。 使用 String a = "伦家是一个非常长的字符串"; //5Lym5a625piv5LiA5Liq6Z2e5bi46ZW/55qE5a2X56ym5Liy String encode = Base64.en

  • 以下是我的要求: 程序将有一个XML文件作为输入,带有3个标记:、和。所有这些数据都是Base64编码的。注意:程序正在使用BC JAR 下面是我试图解码证书的代码: 当我打印new String(certByteValue, Standard ardCharset.UTF_8)的值时,程序正在打印一些无法识别的文本。当执行代码的最后一行时,系统正在抛出 java.security.cert.证书

  • 问题内容: 这是我的代码,我不明白为什么解码功能不起作用。 请少有洞察力会很棒。 它给了我:[解码错误-输出不是utf-8] [解码错误-输出不是utf-8] 问题答案: 返回 最大 长度。 此长度对于调整缓冲区大小很有用,但是不会写入缓冲区的一部分,因此将不是有效的UTF-8。 您只需要使用函数返回的实际写入长度即可。

  • new String(..)转字符串的时候是怎么知道 -28, -72, -83 为一组的呢? 是字符编码有什么规则吗?( 0x**---- ,(byte) ** 是负数的就是3个字节一组这样?)

  • 主要内容:1 Java8 Base64编码解码的介绍,2 基本编码和解码,3 URL和文件名的编码解码,4 MIME,5 Base64的内部类,6 Base64的方法,7 Base64.Decoder的方法,8 Base64.Encoder的方法,9 Java Base64案例:基本编码和解码,10 Java Base64案例:URL编码和解码,11 Java Base64案例:MIME编码和解码1 Java8 Base64编码解码的介绍 Java提供了一个Base64类来处理加密。您可以使用提

  • Base64编码将二进制数据转换为文本格式,通过通信通道传递,用户可以安全地处理文本。 Base64也称为Privacy enhanced Electronic mail (PEM) ,主要用于电子邮件加密过程。 Python包含一个名为BASE64的模块,它包括两个主要功能,如下所示 - base64.decode(input, output) - 它解码指定的输入值参数,并将解码的输出存储为对

  • 问题内容: Android中是否存在用于String的base-64解码器和编码器? 问题答案: 看到 似乎这是在API版本8或android 2.2中添加的,因此在较旧的平台上将不可用。 但是它的来源是这样,如果需要的话,可以将其原样复制为旧版本。

  • 问题 你需要使用Base64格式解码或编码二进制数据。 解决方案 base64 模块中有两个函数 b64encode() and b64decode() 可以帮你解决这个问题。例如; >>> # Some byte data >>> s = b'hello' >>> import base64 >>> # Encode as Base64 >>> a = base64.b64encode(s)