JWT ES256 base64编码EC密钥

问题描述

当我尝试base64urlencode的公钥xy(ES256)与JSON Web令牌一起使用时,我遇到了填充问题。

我有xy作为字符串,并且密钥都长64个字符(64 hex chars = 32 byte = 256 bit),这是ES256的正确长度。当我尝试转换用于JSON Web令牌的密钥时,必须存在一些填充错误(?),因为base64urlencoded版本应为32个八位字节。但是,y长33个八位位组吗?

我假设问题出在BigInteger转换上,但是我不确定如何验证这种猜测或如何解决

public void test() {
    String pubX = "588ba2025dc9d8ce31f3dd55aa38f2635947cda89f97864405bfa1dbe0fae57c";
    String pubY = "a2ea7858b8276917f18b043486d7f55d18241b1bd34c66a4ab507fa259c9798a";

    System.out.println("pubX.length=" + pubX.length());
    System.out.println("pubY.length=" + pubY.length());

    String x = encodeBase64(new BigInteger(pubX,16).toByteArray());
    String y = encodeBase64(new BigInteger(pubY,16).toByteArray());

    System.out.println("x="+x);
    System.out.println("x.length (octets)=" + java.util.Base64.getUrlDecoder().decode(x).length);
    System.out.println("y="+y);
    System.out.println("y.length (octets)=" + java.util.Base64.getUrlDecoder().decode(y).length);
}

public String encodeBase64(byte[] input) {
    // RFC7515 specifies that we must not use padding for base64urlencode
    return java.util.Base64.getUrlEncoder().withoutPadding().encodetoString(input);
}

输出

pubX.length=64
pubY.length=64
x=WiuiAl3J2M4x891VqjjyY1lHzaifl4ZEBb-h2-D65Xw
x.length (octets)=32
y=AKLqeFi4J2kX8YsENIbX9V0YJBsb00xmpKtQf6JZyXmK
y.length (octets)=33

上下文:我正在开发Acme客户端,但消息被拒绝,并显示密钥填充不正确的错误

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)