微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JWT ES256 base64编码EC密钥

如何解决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 举报,一经查实,本站将立刻删除。