本文介绍了解码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中相应地读取为n和e。根据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编码值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!