我正在使用jwt的java代码,但与在线工具相比有一些细微的变化。为什么?

我正在使用jwt的java代码,但与在线工具相比有一些细微的变化。为什么?,java,jwt,signature,Java,Jwt,Signature,我有一段java代码: public static String generate(String key, String data) throws NoSuchAlgorithmException, InvalidKeyException { if (key == null || data == null) { throw new NullPointerException(); } fina

我有一段java代码:

 public static String generate(String key, String data) throws NoSuchAlgorithmException, InvalidKeyException {
            if (key == null || data == null) {
                throw new NullPointerException();
            }
            final Mac hMacSHA256 = Mac.getInstance(HMAC_SHA256);
            byte[] hmacKeyBytes = key.getBytes(StandardCharsets.UTF_8);
            final SecretKeySpec secretKey = new SecretKeySpec(hmacKeyBytes, HMAC_SHA256);
            hMacSHA256.init(secretKey);
            byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8);
            byte[] res = hMacSHA256.doFinal(dataBytes);

            return Base64.getEncoder().encodeToString(res);

        }
使用Base64编码,我得到以下签名: OpDZIL3l/RRZoeDgMBmlaRGPAthcbyiZJt5wqWFPSK4=

如果我检查在线工具,那里的签名显示: OPDZIL3LrrzoedgmlArgPathCBYIZJT5WQWFPSK4=

只有“\u1”被替换为“/”。 谁能帮我解决这个问题,因为我是新加入JWT的

提前谢谢

只有“\u1”被替换为“/”。有人能帮我解决这个问题吗 我是JWT的新手

这与JWT无关-这两个系统只是使用Base64编码的不同变体

问题是,Base64有多种变体。这本书有一个很好的概述

特别是,有所谓的“URL安全”编码,或base64url,在中标准化。与常规Base64的唯一区别在于,它使用字符
-
而不是
+
/
。这就是你所看到的


顾名思义,URL安全编码的优点是编码字符串可以作为查询参数包含在URL中,而无需进一步编码(即URL百分比编码)。standard Base64使用的字符
+
/
在URL中具有特殊意义,因此需要进行编码,因此它们被
-
替换

URL安全编码通常用于JWT,因为它们通常作为URL参数传递