问题标签 [jwk]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3712 浏览

c# - 解码 Base64urlUInt 编码的值

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

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

将正整数值或零整数值表示为该值的无符号大端表示的 base64url 编码为八位字节序列。八位字节序列必须使用表示值所需的最小八位字节数。零表示为 BASE64URL(单个零值八位字节),即“AA”。

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

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

0 投票
7 回答
72971 浏览

c# - 在 C# 中使用公钥验证使用 RS256 算法签名的 JWT

好的,我知道我要问的问题可能很明显,但不幸的是我缺乏这方面的知识,而且这项任务对我来说似乎很棘手。

我有一个 OpenID Connect Provider 返回的 id 令牌 (JWT)。这里是:

eyJraWQiOiIxZTlnZGs3IiwiYWxnIjoiUlMyNTYifQ.ewogImlzcyI6ICJodHRwOi8vc2VydmVyLmV4YW1wbGUuY29tIiwKICJzdWIiOiAiMjQ4Mjg5NzYxMDAxIiwKICJhdWQiOiAiczZCaGRSa3F0MyIsCiAibm9uY2UiOiAibi0wUzZfV3pBMk1qIiwKICJleHAiOiAxMzExMjgxOTcwLAogImlhdCI6IDEzMTEyODA5NzAsCiAiY19oYXNoIjogIkxEa3RLZG9RYWszUGswY25YeENsdEEiCn0.XW6uhdrkBgcGx6zVIrCiROpWURs-4goO1sKA4m9jhJIImiGg5muPUcNegx6sSv43c5DSn37sxCRrDZZm4ZPBKKgtYASMcE20SDgvYJdJS0cyuFw7Ijp_7WnIjcrl6B5cmoM6ylCvsLMwkoQAxVublMwH10oAxjzD6NEFsu9nipkszWhsPePf_rM4eMpkmCbTzume-fzZIi5VjdWGGEmzTg32h3jiex-r5WTHbj-u5HL7u_KP3rmbdYNzlzd1xWRYTUs4E8nOTgzAUwvwXkIQhOh5TPcSMBYy6X3E7-_gr9Ue6n4ND7hTFhtjYs3cjNKIA08qm5cpVYFMFMG6PkhzLQ

它的标头和有效负载被解码为:

从 OIDC 提供商的发现中,我得到了公钥 (JWK):

所以,问题是我如何在 C# 中使用我拥有的 RS256 算法的公钥来验证这个 JWT?如果有一个很好的教程明确描述这个过程,那就太棒了。但是,如何使用的示例System.IdentityModel.Tokens.Jwt也可以正常工作。

更新:我明白,我需要做一些类似下面的代码的事情,但我不知道从哪里得到' key '来计算 SHA256 哈希。

0 投票
1 回答
684 浏览

oauth-2.0 - 应该使用 OAuth 2.0 提供者的哪个 JWK 来验证 OpenID Connect `id_token`?

如果身份验证服务器提供多个 JSON Web 密钥(例如https://www.googleapis.com/oauth2/v3/certs),它们应该用于验证 OpenID Connectid_token作为 OPenID Connect 隐式流程的一部分?

是否应该id_token使用第一个 JSON Web 密钥、所有 JSON Web 密钥id_token进行验证,或者如果可以使用这些提供的任何 JSON Web 密钥进行验证,则认为它是有效的?

谢谢!

0 投票
0 回答
1215 浏览

objective-c - 如何将 JWE JSON 转换为 PEM

我想将 JWE JSON 转换为 PEM 格式。我正在使用 OpenSSL 和椭圆曲线密码术。

这是JSON

现在根据crv值,我正在设置 EC 曲线属性:

现在我将 JSON 解析为 JWK 对象

因为当我们clientPublicKey在下面的代码中使用时,thenkey的结果是 nil。

0 投票
1 回答
1315 浏览

openssl - 将 ECC 公钥的 Bignum 转换为 JWK X、Y 坐标

我使用 EC_Key 在 OpenSSL 中创建了公钥和私钥,并具有 BigNum 格式的 x、y 和 d 组件。

现在我想按照 JWK 标准将这些 Bignum 值转换为 Base64URLEncoded 值。

例如

目前x coordinate76638B4D8040018F834AE6D6540B20E1CA95F6A8C61BE6118062918904B5C5A7

在 ObjC 中使用 OpenSSL 和 JSONKit 作为

在转换它时,它给出Base64URL encoded string

x:dmOLTYBAAY-DSubWVAsg4cqV9qjGG-YRgGKRiQS1xac

但是,在使用 Jose4J 在服务器上解码相同的 x 坐标时,将其返回为:

53548795424402895049922051400723229099982122334687022963594437126482323424679

这类似于网站上提供的: http ://www.mobilefish.com/services/big_number/big_number.php

由此表明它是 BigInt 的十进制表示

IE

  1. 将 BigInt 转换为十进制

  2. 十进制到 ASCII 字符串

  3. 然后到 Base64 url​​ 编码。

但是在应用此过程时,服务器不接受 JOSE4J 库中的 JWK 参数。

0 投票
1 回答
1332 浏览

javascript - Python 中的 Web Crypto API JWK 用法

我正在开发一个 P2P 基础设施,它将拥有来自一组不同应用程序的数据,这些数据通过网络分布。这个 P2P 覆盖由一组 Python Twisted 服务器组成。

我需要为每个应用程序的每个用户保证存储数据的安全性和隐私性。因此,我使用Web Crypto API在 Web 应用程序的客户端生成一对 RSA 密钥。RSA 密钥对也将存储在 P2P 覆盖中。所以,我在客户端加密了私钥和用户密码的派生。

此外,我正在使用jwk to pem模块将 JWK 公钥转换为 PEM 密钥,以便在 Python 密码库(PyCrypt 或 m2Crypto)中使用。

最后,我必须保证包含这些凭据的消息以及用户数据保持其完整性。因此,在客户端,我使用用户的私钥对这些数据进行签名。

我将 ArrayBuffer 类型的数据和签名发送到服务器,以 base64 编码。

之后,当 Python 服务器收到这个 http 请求时,它会从 base64 解码数据和签名。

为了验证签名,需要公钥。最后:

(utils.byteify() 将 unicode 字符串转换为常规字符串)

验证签名:

方法定义:

但是,签名验证返回 False。我也尝试使用 m2crypto 库,但它返回 0。

0 投票
1 回答
305 浏览

security - 本地 Google OAuth JWT 验证

我正在开发一个使用谷歌登录的网站。用户登录后,我会从 google js api 获取一个 id 令牌并发送到服务器进行验证。

我可以使用 Google 令牌信息端点轻松验证和执行该过程,但这会导致大量 HTTPS 请求,因为每次用户使用 google 登录时它都会向 google 发送 HTTPS 请求。

因此,我在服务器本地验证 JWT(id 令牌),我已经成功验证了 JWT,没有问题。我面临的问题是我必须在程序中缓存谷歌公共JWK

每次我无法为相应的 JWT“孩子”找到正确的 JWK 时,我都在考虑更新 JWK。但这会导致每次找不到具有相应“孩子”的 JWK 时向 google 发送 HTTPS 请求。

这会是一个漏洞吗?是否存在我应该更新 Google 公共 JWK 的静态时间段?

有人可以帮我弄这个吗 ?如果我做错了什么,并指出我正确的方向

谢谢

0 投票
2 回答
1224 浏览

javascript - 将加密 ECDH 公钥解析为 JWK 格式以与 WebCrypto 一起使用

我生成了一个 ECDH 密钥对,并从中获取了公钥。使用 nodejs 和加密库。

我正在实现一个客户端库来使用这个公钥、ECDH 算法和来自 WebCrypto 的SubtleCrypto接口来加密数据。

为了实现这一点,我必须导入公钥(使用 nodejs 加密生成),WebCrypto importKey 方法有一些格式选项可以做到这一点,但我可以让它不使用它们。我注意到这jwk比其他人更常用。

一个例子jwk

那么如何将我的公钥解析为一个jwk对象。我的公钥如下所示: 04f8b2a6e9d2ffa424c3e7b6addf23112153920fd0209390da460f99e03bf8665052e72df4a0b7927381f1b026c98a3a2b348fdd10969875e6b0e86cb1f093a5fc07e49fbbbf091922ce71af17f4a79de03f6069836a7143b137be34451f162235

0 投票
1 回答
865 浏览

json - 如何为 Json Web Keys 设置代理服务器

我正在尝试为谷歌 JSON 网络密钥构建 JWKS 对象,以验证从谷歌接收到的 JWT 令牌的签名。在我们的公司环境中,我们需要设置代理服务器以与外部服务器联系。下面的代码在公司环境之外运行。

HttpsJwks https_jwks = new HttpsJwks(GOOGLE_SIGN_KEYS); List<JsonWebKey> jwks_list = https_jwks.getJsonWebKeys();

图书馆:jose4j0.4.1

提前致谢。

0 投票
2 回答
2133 浏览

security - 在给定 JWT 标头的情况下选择 JWKS 中的键

在给定 JWS (JWT) 标头的情况下,是否有在 JWKS 密钥库中选择签名验证密钥的标准方法?

我的目标是实现 OpenID Connect ID 令牌验证库,我正在尝试灵活并预测不同的配置,但我不确定如果密钥选择是特定于 IdP 的,这样做是否有意义。

我当前的算法遍历 JWKS 并过滤掉:

  1. 如果 JWK 有“use”字段如果“use”不等于“sig”则拒绝
  2. 如果 JWK 有“key_ops”字段如果“key_ops”不包含“verify”则拒绝
  3. 如果 JWK 具有“alg”字段,则如果它与 JWS 标头值不同,则拒绝
  4. 如果 JWS 标头具有“kid”字段如果 JWK 没有或具有不同的值则拒绝(注意相反的逻辑)
  5. 如果在这个阶段只剩下一个 JWK,我会使用那个。否则就是失败。

这种方法“足够标准”吗?

=== 编辑 ===

我发现OpenID Connect 核心规范的第 10.1 节说:

使用 RSA 或 ECDSA 签名时,JOSE 标头的 alg 标头参数值必须设置为 JSON Web 算法 [JWA] 中定义的适当算法。用于签署内容的私钥必须与发送者在其 JWK Set 文档中发布的用于签名验证的公钥相关联。如果引用的 JWK 集合文档中有多个键,则必须在 JOSE 标头中提供一个孩子值。各个密钥的密钥用法必须支持签名。

JWK“使用”是强制性的,所以我可以安全地要求它是“签名”。

如果 JWKS 中有多个密钥,则 JWT "kid" 是强制性的。这表明(尽管间接地)在这种情况下 JWT “kid” 和 “JWK” 孩子应该匹配。“孩子”不需要是唯一的,所以你仍然需要额外的规则。