解码Base64urlUInt编码值 [英] Decoding Base64urlUInt-encoded value

查看:88
本文介绍了解码Base64urlUInt编码值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我通常尝试做的是验证从OpenID Connect提供商(例如Google)获得的id_Token值。使用RSA算法对令牌进行签名,并从Discovery文档(jwks_uri参数)读取公钥。例如,here可以使用JWK格式的Google密钥:

{
  kty: "RSA",
  alg: "RS256",
  use: "sig",
  kid: "38d516cbe31d4345819b786d4d227e3075df02fc",
  n: "4fQxF6dFabDqsz9a9-XgVhDaadTBO4yBZkpUyUKrS98ZtpKIQRMLoph3bK9Cua828wwDZ9HHhUxOcbcUiNDUbubtsDz1AirWpCVRRauxRdRInejbGSqHMbg1bxWYfquKKQwF7WnrrSbgdInUZPv5xcHEjQ6q_Kbcsts1Nnc__8YRdmIGrtdTAcm1Ga8LfwroeyiF-2xn0mtWDnU7rblQI4qaXCwM8Zm-lUrpSUkO6E1RTJ1L0vRx8ieyLLOBzJNwxpIBNFolMK8-DYXDSX0SdR7gslInKCn8Ihd9mpI2QBuT-KFUi88t8TW4LsoWHAwlgXCRGP5cYB4r30NQ1wMiuQ",
  e: "AQAB"
}

我将使用RSACryptoServiceProvider类来解码签名。要初始化它,我必须向RSAParameters提供Modulus和Exponent值。这些值从上面的JWK中相应地读取为ne。根据specification,这些值是Base64urlUInt编码值:

正整数值或零整数值表示为 值的无符号大端表示形式的base64url编码 作为八位字节序列。八位字节序列必须使用最小 表示值所需的二进制八位数。表示为零 作为BASE64URL(单个零值二进制八位数),即";aa";。

因此,我的问题是如何解码这些值以将它们放入RSAParameters?我尝试将它们解码为公共Base64url字符串(Convert.FromBase64String(modulusRaw)),但显然不起作用,并生成以下错误:

输入不是有效的Base-64字符串,因为它包含非Base 64 字符、两个以上的填充字符或非法字符 在填充字符中。

推荐答案

RFC 7515定义base64url编码如下:

使用URL和文件名安全字符集的Base64编码 在RFC 4648的第5节中定义,所有尾随‘=’ 被省略的字符(如第3.2节所允许的),并且没有 包括任何换行符、空格或其他附加内容 人物。请注意,空二进制八位数的base64url编码 序列是空字符串。(有关以下说明,请参阅附录C 实现无填充的base64url编码。)

RFC 4648将"Base 64 Encoding with URL and Filename Safe Alphabet"定义为常规Base64,但是:

  • 可以省略填充(如此处所示)
  • 使用-而不是+_而不是/

因此,要使用常规Convert.FromBase64String,您只需反向执行该过程:

static byte[] FromBase64Url(string base64Url)
{
    string padded = base64Url.Length % 4 == 0
        ? base64Url : base64Url + "====".Substring(base64Url.Length % 4);
    string base64 = padded.Replace("_", "/")
                          .Replace("-", "+");
    return Convert.FromBase64String(base64);
}

此代码可能已存在于框架中的某个位置,但我不知道。

这篇关于解码Base64urlUInt编码值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆