问题标签 [jose4j]
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.
jose4j - jose4j JSONAware 的反面
我在 jose4j 上使用了出色的 JSONAware 接口(使用 toJSONString 方法),这样我就可以在一个声明下添加一个复杂的 JSON 结构——它生成的正是我希望 JWT 看起来的样子。
但是现在我正试图从 JWT 中提取相同的声明,并且似乎没有内置的方法来扭转它。我希望另一个接口(或同一接口上的方法)带有一个名为 fromJSONString 的方法或我可以调用的东西:
getClaimValue(字符串,JSONAwareImpl.class)
然后返回类(我使用该方法的实现)。
对此有什么想法吗?目前我唯一的解决方案是以原始格式获取整个 JWT 并解析整个内容以仅提取我的声明。能够走一条路而不走另一条路似乎有点奇怪,我想知道我是不是错过了什么?
谢谢。
jose4j - 签名 JWT 和 JWK 之间的 jose4j 算法不匹配
在单元测试期间,我注意到一些预期的行为。
我使用您的代码生成了一个 RsaJsonWebKey 密钥对。创建后,我将算法设置为 RS512。我基于此创建了一个公共 JWK。此时,密钥对和 JWK 具有相同的密钥 ID、算法和签名。接下来在 UT 中,我将 JWK 的算法更改为 RS256。我预计这会失败,但它仍然匹配并验证。当然,密钥 ID,最重要的是,签名仍然匹配。算法真的有必要吗?查看 Jose4J 源代码,它似乎从未设置为与 JWK 匹配。
在 SimpleJwkFilter.filter() 方法中
匹配 &= isMatch(alg, jwk.getAlgorithm()); <-- alg 从未设置,因此通过 isMatch
java - 为什么我的 Azure 访问令牌 JWT 未能通过 Java 签名验证?
在我的 Java Web 应用程序中验证从 Azure 收到的访问令牌时遇到问题。图书馆jose4j
只是signature.verifySignature()
简单地返回false
。有人可以帮我理解我做错了什么吗?
我已经成功配置了一个前端 Web 应用程序以通过 Azure Active Directory 登录,它会收到一个签名的 Json Web 令牌形式的访问令牌。我打算在"Authoriation": "token <signed-access-token>"
对我的其他面向数据库的 Web 应用程序的所有请求中将该 JWT 附加到标头中。我想创建一个 Spring 过滤器来验证每个面向数据库的 Web 应用程序的 JWT 签名,以确保令牌实际上是由 Azure 颁发的。
我在这个 github repo 的分支中有我的小概念证明的代码: repo。但这是我的过滤器:
下面是 Base64 解码的令牌元数据的样子:
下面是 Base64 解码的 Token Body 的样子:
现在我已经看到有人提到nonce
可能会引发验证(链接),但我不明白这是怎么发生的。我的意思是 JWT 的前 2 部分已签名,为什么它们包含的属性会影响签名的有效性?除非 Microsoft 签署令牌,然后在计算签名后添加随机数?
openid-connect - 使用 jose4j 验证过期的 oidc 令牌
在我们的端点上,我们得到一个 OIDC 令牌和一个刷新令牌。当 OIDC 令牌过期时,我们希望使用提供的刷新令牌刷新令牌。目前,除了禁用所有默认验证器之外,我认为没有办法只排除到期验证。
在 Jose4j 中有可能吗?
jose4j - Jose4j:无法为带有标头的 JWS 找到合适的验证密钥
验证失败,因为 key_ops 不符合SimpleJwkFilter
从静态方法filterForInboundSigned(JsonWebSignature jws)
中创建的条件SelectorSupport
。公钥看起来像这样:
根据SimpleJwkFilter
“key_ops”要么必须为空,要么包含值“验证”以匹配标准。
有没有办法在 jose4j 中自定义这种行为?也许跳过“key_ops”的验证?
java - 如何在java中使用私钥解密JWE(Json Web Encryption)数据
我有一个类似于下面的私钥
例如
我有一个如下的 JWE 数据,它是使用从上面的私钥/证书生成的公钥加密的
有人可以给我java代码,我可以用我的私钥来解密这个JWE吗?我无法从互联网上找到明确的答案。如果对这个 JWE 概念不熟悉,我很友善
java - 如何将字符串转换为私钥并将其设置为 JsonWebSignature
我已经有一个私钥存储在数据库中,varchar2
并存储在一个变量Key
中,如代码所示。下面是我将此私钥设置为 JsonWebSignature 的一段代码,但我收到类似的错误
JsonWebStructure 类型中的方法 setKey(Key) 不适用于参数 (String)
我不想生成新的 RSA 密钥,因为我已经有了它。
node.js - 使用由 jose4j HMAC_SHA256 生成的令牌在 node.js 中使用 jsonwebtoken 验证 JWT
好的,所以我有一个使用 jose4j 库生成 JWT 的后端 Java 服务。这已经在生产中,我们还有其他几个 Java 服务正在验证这些令牌,并且一切正常。我现在正在尝试创建一个 NodeJS 服务,它还需要验证原始 Java 服务正在生成的 JWT。这是使用 jose4j 生成令牌的 Java 代码。
这是我试图验证 JWT 的 NodeJS 代码。
config.signature 和 Vars.SECRET_KEY 是相同的值。但这会导致“无效签名”。
wso2 - wso2am-2.6.0 无效的 jwt 签名
在 WSO2AM-2.6.0(6.x 分支)中为后端服务启用 JWT 签名
但是 - 开发人员抱怨签名无效(根据 JOSE 库)。我在jwt.io页面中测试了令牌,它还声称签名无效。
我从以前的版本(wso2am-2.1.0)中看到签名生成发生了变化(不使用任何外部框架),但是对于更改,其他框架(jose,jwt.io)认为签名无效
有什么方法可以配置 wso2am 以创建有效(有效)签名?
编辑:
我看到 JWT 令牌仅使用 APIMJWTGenerator 进行签名,尽管它无助于使令牌有效
例外是
验证是否与x5t标头属性有关?
Edit2:显然 xt5t 标头应包含 SHA-1 证书签名,提供的值NTA3YzJmZDk0OTg4N2ViNWRlY2M4N2NlMDdjMmNlNjliOTRkYjM1OA
太长而不能成为 SHA-1 或无效
编辑3:
似乎问题与https://github.com/wso2/carbon-apimgt/issues/5535有关,该修复显然破坏了与后端服务的兼容性(以及使用的框架,准备修复)
java - 使用 jose4j 的 ECDH + JWE 加密/解密
我正在尝试在 Android (Java) 中与 JWE 一起实现 ECDH 加密/解密。
我发现jose4j和Nimbus JOSE库旨在满足我的所有需求,但似乎比我想象的更具挑战性。
如果有人熟悉,那就是 3D Secure 2.0 ......
在下面的规范中:
- SDK =本地端
- DS = 目录服务器(另一端)
接下来是规格:
- 给定:P(DS) - EC 公钥(以 PEM 格式提供,可以转换为 PublicKey 或 JWK)
- 生成一个新的临时密钥对 (Q(SDK), d(SDK))
- 根据 JWA (RFC7518) 在 Direct Key Agreement 模式下使用曲线 P-256、d(SDK) 和 P(DS) 进行 Diffie-Hellman 密钥交换过程以生成 CEK。此版本规范支持的参数值为:
- “alg”:ECDH-ES
- “apv”:目录服务器 ID
- “epk”:P(DS),inJSONWebKey(JWK)格式{“kty”:“EC”,“crv”:“P-256”}
- 所有其他参数:不存在
- CEK:"kty":oct-256bits
- 生成 128 位随机数据作为 IV
- 使用 CEK 和 JWE 紧凑序列化根据 JWE (RFC7516) 加密 JSON 对象。此版本规范支持的参数值为:
- “alg”:目录
- “epk”:Q(SDK)作为{“kty”:“EC”,“crv”:“P-256”}
- “enc”:“A128CBC-HS256”或“A128GCM”
- 所有其他参数:不存在
- 如果算法是 A128CBC-HS256,则使用完整的 CEK,或者如果算法是 A128GCM,则使用 CEK 的最左边 128 位。
- 删除临时密钥对 (Q(SDK),d(SDK))
- 将生成的 JWE 作为 SDK 加密数据提供给 3DS 服务器
如果有人已经实现了这个确切的规范并且可以分享代码,那就太棒了!!
在 jose4j 的示例中有一个使用 ECDH 创建 JWT 的示例:
https ://bitbucket.org/b_c/jose4j/wiki/JWT%20Examples (最后一个示例,标题为“生产和使用嵌套的(签名和加密的)JWT ”)。
但是这个例子并不是我所需要的。当我需要加密文本时,它会创建一个令牌。
从上面规范中的 "CEK:"kty":oct-256bits" 开始,我不明白该怎么做。
这是我使用 Nimbus lib 的代码(到目前为止):
这是雨云输出:
nimbus_encrypt: jwe = {"epk":{"kty":"EC","crv":"P-256","x":"AS0GRfAOWIDONXxaPR_4IuNHcDIUJPHbACjG5L7x-nQ","y":"xonFn1vRASKUTdCkFTwsl16LRmSe-bAF8EO4-mh1NYw"} ,"apv":"RjAwMDAwMDAwMQ","enc":"A128CBC-HS256","alg":"ECDH-ES"}
nimbus_encrypt: serializedJwe = eyJlcGsiOnsia3R5IjoiRUMiLCJjcnYiOiJQLTI1NiIsIngiOiJBUzBHUmZBT1dJRE9OWHhhUFJfNEl1TkhjRElVSlBIYkFDakc1TDd4LW5RIiwieSI6InhvbkZuMXZSQVNLVVRkQ2tGVHdzbDE2TFJtU2UtYkFGOEVPNC1taDFOWXcifSwiYXB2IjoiUmpBd01EQXdNREF3TVEiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiRUNESC1FUyJ9..Pi48b7uj3UilvVXKewFacg.0sx9OkHxxtZvkVm-IENRFw.bu5GvOAwcZxdxaDKWIBqwA
这是我的代码(到目前为止,使用@Brian-Campbell 的答案)使用 jose4j lib:
这是 jose4j 输出:
jose4j_encrypt: jwe = JsonWebEncryption{"alg":"ECDH-ES","enc":"A128CBC-HS256","apv":"RjAwMDAwMDAwMQ","epk":{"kty":"EC","x" :"prvyhexJXDWvPQmPA1xBjY8mkHEbrEiJ4Dr-7_5YfdQ","y":"fPjw8UdfzgkVTppPSN5o_wprItKLwecoia9yrWi38yo","crv":"P-256"}}
jose4j_encrypt: serializedJwe = eyJhbGciOiJFQ0RILUVTIiwiZW5jIjoiQTEyOENCQy1IUzI1NiIsImFwdiI6IlJqQXdNREF3TURBd01RIiwiZXBrIjp7Imt0eSI6IkVDIiwieCI6InBydnloZXhKWERXdlBRbVBBMXhCalk4bWtIRWJyRWlKNERyLTdfNVlmZFEiLCJ5IjoiZlBqdzhVZGZ6Z2tWVHBwUFNONW9fd3BySXRLTHdlY29pYTl5cldpMzh5byIsImNydiI6IlAtMjU2In19..gxWYwFQSOqLk5HAgs7acdA.mUIHBiWpWSlQaEOJ_EZGYA.eiTe-88fw-Jfuhji_W0rtg
可以看出,最终结果中的“alg”标头是“ECDH-ES”,而不是“dir”。
如果我要实现通信的双方就足够了,但是有了这个规范,这里似乎缺少许多配置......
使用 jose4j 的代码更长,似乎更可配置,但我无法构建足够有价值的东西来发布在这里。
对我来说主要缺少的部分是如何从上面的规范生成 CEK。
谢谢你。
编辑
在上面添加了 jose4j 代码并添加了输出...