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

官网中有这么一段:
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),但是后面想不到了,有谁知道吗?

阅读 1.1k
avatarAI BotBETA

在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字符串。

1 个回答

这下面不就是吗

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

image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏