首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Google解码和验证Base64urlUInt编码的RS256公钥

从Google解码和验证Base64urlUInt编码的RS256公钥
EN

Cryptography用户
提问于 2018-07-12 19:23:17
回答 1查看 3.1K关注 0票数 2

根据谷歌的说法,要访问它发送的id_token以及访问令牌(用于访问它们的API),您必须首先使用从此页获得的RS256公钥验证令牌。公钥响应如下:

代码语言:javascript
复制
  {
   "kty": "RSA",
   "alg": "RS256",
   "use": "sig",
   "kid": "8c9eb968f73744eaed421e48010142bce51a067f",
   "n": "uweJ3hFY9wqZ6ZG-iSNhQwHtKCGl8G_jcQgGPjOrS-Rum3dyDjicqkAyfS8XDn480KD_TZ5m-lqBjqfimePu2_cH4URDPIwsqSzJI2_piEhaqnXRptIe5YB5imAL6iETKaOPjw284Fc7EdHK-ekHMn3AXjsy9AIErwAVw4-4ZXXwHbyQXJy1DyUB4ZzxiEvw_qkQmLdltmrNkLOw-Xh-C9UkTZ9NA58bYPBnxLwnAu_ggw_g_-hCAs6OvXZbAfFHhIGBLyjtdDLVrfXo1112QREB9d5sEds0bKZtJcD9afl4E7Ht6G-g3jNP2clAu6-6B-cIe4-j8Ph1uJDPkAmDfw",
   "e": "AQAB"
},

根据Google & RFC规范7518的说法,这是一个Base64urlUInt编码的RS256公钥。"n“参数是模量,"e”参数是指数。其余部分只是为了验证算法本身,而不是用于解密/解密的公钥。

我的问题源于这样一个事实:从我在网上读到的信息来看,这不是一个标准的RS256公钥。当试图验证我的IDtoken时,它会弹回ValueError: Could not deserialize key data. (技术并不重要,但我在python中使用pyJWT模块)。我知道ID令牌没有问题,因为如果我跳过验证,我就没有问题。当然,这不适合生产环境。

我尝试将其转换为常规Base64,分别将'-‘和'_’替换为'+‘& '/',并为填充添加'=’。我甚至试着给‘-开始公钥我还试着把"AQAB“指数附加到模数的末尾,但也没有成功。

我还试着玩其他在网上生成的公钥&这些都很好。即使我故意键入错误,我也会得到一个错误,说明它无法验证令牌,而不是返回一个奇怪的ValueError

所以我的问题是: Google给我的“公钥”模数/指数有什么问题吗,或者我是如何使用/转换它的?我错过台阶了吗?任何帮助都是非常感谢的,因为我是这个话题的新手。提前谢谢!!

EN

回答 1

Cryptography用户

回答已采纳

发布于 2018-07-12 19:42:57

这两个值都是无符号的,大端值,编码为基-64-url。基本上,这意味着没有符号位,最重要的位是向左(基于字节索引零的位B_7 --基于零的索引)。因此,您首先需要对值进行基-64 url解码,然后将它们转换为一个大的数字。最后,您需要通过提供模数$n$和指数$e$来组合这两个大数字来形成公钥。

如果不能将数字组合到公钥,则可能需要将公钥编码为PKCS#1公钥或SubjectPublicKeyInfo ( X.509结构)。对于这两个操作,您要么需要自己创建编码(这非常困难),要么需要访问并了解如何使用ASN.1库。

您可能想看看“危险垫”密码包中的RSA公钥接口,其中有load_rsa_public_numberspublic_bytes(encoding, format)PEMSubjectPublicKeyInfo

票数 3
EN
页面原文内容由Cryptography提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://crypto.stackexchange.com/questions/60751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档