【发布时间】:2019-12-08 03:48:52
【问题描述】:
我有一个公钥,现在我不确定如何使用它来验证 JWT 令牌的签名。我已经尝试使用here 所示的想法(用于验证),但不同之处在于我使用的是 384(在示例中不是 256)并且不确定我应该跳过数组中的哪些字节并进入考虑。我也尝试过使用同样失败的外部库,可能是出于同样的原因。我不确定如何从我拥有的公钥字节数组中提取 X 和 Y。这些例子似乎都假设你已经知道 X 和 Y:
字符串标记 = "eyJhbGciOiJFUzI1NiIsImN0eSI6InRleHRcL3BsYWluIn0.eyJoZWxsbyI6ICJ3b3JsZCJ9.EVnmDMlz-oi05AQzts-R3aqWvaBlwVZddWkmaaHyMx5Phb2NSLgyI0kccpgjAyo1S5KCB3LIMPfmCX_ob";
byte[] x = { 4, 114, 29, 223, 58, 3, 191, 170, 67, 128, 229, 33, 242, 178, 157, 150, 133, 25, 209, 139, 166, 69, 55, 26, 84, 48, 169, 165, 67, 232, 98, 9 };
byte[] y = { 131, 116, 8, 14, 22, 150, 18, 75, 24, 181, 159, 78, 90, 51, 71, 159, 214, 186, 250, 47, 207, 246, 142, 127, 54, 183, 72, 72, 253, 21, 88, 53 };
var publicKey=EccKey.New(x, y);
string json = Jose.JWT.Decode(token,publicKey);
此外,当我伪造字节数组以克服由于 X 和 Y 大小不正确等原因导致的初始异常时,我发现我仍然有 100% 的时间出现异常。 我将此问题追溯到这样一个事实,即我正在使用的所有库都在尝试创建一个 CngKey,这会导致“不受支持的平台异常”,因为我在 MacOS 上进行开发。
鉴于信息表here,我看到了这样的解释:
这是有道理的。但是,我希望避免仅仅使用ECDsaOpenSsl 并安装 OpenSSL 就必须实现我自己的这些库实现,并且我希望能够部署到 Windows 环境而无需检查哪个操作系统正在执行代码。
总结起来有2个问题:
- 我不确定如何从我的公钥字节中提取 X 和 Y 坐标 大批。我链接的第一个例子来自一个知道 数组的第一个索引被跳过,数组的其余部分 被平均分割。如果我我的数组会有奇数位数 这样做了,所以我不确定要跳过哪些索引,如果它甚至适用 在这里。
- 我希望在验证签名时能够进行奇偶校验 Mac 和 Windows 都没有滚动我自己的库。
【问题讨论】:
-
@Topaco 这些链接内容丰富且有用 - 谢谢。这是我请求的本地密钥的临时版本:cutt.ly/CruTp2l 它是用 secp384r1 编码的 base 64
-
发布的公钥以 X.509 格式指定,here, section C.3,并且可以使用 ASN.1 解析器最容易地读取,例如here。最后,可以以未压缩格式
04 | x (48 bytes) | y (48 bytes): 04 | ddd1...3ae7 | f01f...2314找到原始公钥。 secp384r1 或 NIST P-384 描述为here, section 2.5。 -
当我将
GetBytes(pubKey)与我的密钥一起使用时,我得到一个包含 160 个元素的字节数组。你是说我需要得到 64-160 的范围并将它们分成 X 和 Y?
标签: openssl cryptography jwt asp.net-core-2.2 jwt-auth