ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

jose 库 EC 椭圆曲线私钥 JWK 接口详解:JWK_EC_Private 结构与实战用法

jose 库 EC 椭圆曲线私钥 JWK 接口详解:JWK_EC_Private 结构与实战用法 网络安全认证鉴权后端【免费下载链接】joseJWA, JWS, JWE, JWT, JWK, JWKS for Node.js, Browser, Cloudflare Workers, Deno, Bun, and other Web-interoperable runtimes项目地址https://gitcode.com/gh_mirrors/jo/jose点击查看免费下载导读JWK_EC_Private是 joseJWA / JWS / JWE / JWT / JWK / JWKS 全栈实现为椭圆曲线EC私钥 JSON Web Key提供的 TypeScript 便捷类型接口完整描述了私钥 JWK 应包含的crv、x、y、d等必填参数以及kid、use、key_ops等可选元数据。本文以该接口文档为骨架结合 jose 仓库的源码实现与测试带你彻底搞懂 EC 私钥 JWK 的字段含义、约束规则以及如何通过importJWK、exportJWK、generateKeyPair与 jose 的签名ES256/ES384/ES512和加密ECDH-ES 系列能力无缝集成。一、JWK_EC_Private 是什么在 jose 的类型体系中JWK_EC_Private定义于 src/types.d.ts被注释为 Convenience interface for Private EC JSON Web KeysEC 私钥 JSON Web Key 的便捷接口。它的核心定义非常精简export interface JWK_EC_Private extends JWK_EC_Public { /** EC JWK d (ECC Private Key) Parameter */ d: string }即一个 EC 私钥 JWK 公钥部分crv、x、y继承自JWK_EC_Public 私钥标量d。与之对应的公钥接口 JWK_EC_Public 定义在 docs/types/interfaces/JWK_EC_Public.md。按照 RFC 7518 的 EC 密钥表示约定d是私钥标量ECC Private Keyx与y是公钥点坐标。三者都是base64url 编码的定长大端序无符号整数与crv指定的曲线长度严格对应。该接口属于 jose 的AnyJWK联合类型的一个成员export type AnyJWK | (JWK_EC_Private { kty: EC }) | (JWK_EC_Public { kty: EC }) | ...见 src/types.d.ts。AnyJWK用于importJWK等 API 的入参类型配合kty: EC字面量可在编译期精确收窄类型。jose 从主入口jose导出该类型见 src/index.ts。从源码结构看jose 的私钥判断逻辑为!!(jwk.d || jwk.priv)见 src/lib/jwk_to_key.ts因此只要 JWK 对象中存在d字段jose 就将其视为私钥并据此推导密钥用途私钥可用于 sign/deriveBits 等操作而公钥不能。二、必填参数crv、d、x、y原文档将crv、d、x、y列为**必填非 optional**属性含义分别如下属性类型含义对应 RFC 术语crvstring曲线名称Curve如P-256、P-384、P-521crv (Curve) ParameterdstringECC 私钥标量d (ECC Private Key) Parameterxstring公钥点 X 坐标x (X Coordinate) Parameterystring公钥点 Y 坐标y (Y Coordinate) Parameter2.1 crvjose 支持的曲线jose 基于 Web Crypto 标准实现EC 相关算法只接受以下三条 NIST 曲线P-256 / P-384 / P-521JWS 签名侧src/lib/jws_algorithms.tsES256 → P-256 SHA-256、ES384 → P-384 SHA-384、ES512 → P-521 SHA-512三者均使用 ECDSA。JWE 密钥管理侧src/lib/jwe_algorithms.tsECDH-ES、ECDH-ESA128KW、ECDH-ESA192KW、ECDH-ESA256KW接受kty: EC的上述三条曲线也接受 OKP 的 X25519但那是另一个密钥类型。在generateKeyPair中jose 对crv选项做了显式校验只允许P-256、P-384、P-521ECDH-ES 还额外允许X25519其余曲线直接抛出JOSENotSupported见 src/key/generate_key_pair.tsswitch (crv) { case P-256: case P-384: case P-521: algorithm { name: ECDH, namedCurve: crv } break case X25519: algorithm { name: X25519 } break default: throw new JOSENotSupported( Invalid or unsupported crv option provided, supported values are P-256, P-384, P-521, and X25519, ) }2.2 x、y、dbase64url 编码的定长整数x、y分别是公钥点的仿射坐标affine coordinatesd是私钥标量。三个值均为 base64url无填充编码的无符号大端整数编码前字节长度由曲线决定P-256 为 32 字节、P-384 为 48 字节、P-521 为 66 字节。在 Web Crypto 中importKey(jwk, ...)要求这三者必须严格匹配曲线的坐标长度否则会校验失败。一个真实的 P-256 私钥 JWK 示例来自 jose 官方文档与 cookbook 的常见形态{ kty: EC, crv: P-256, x: ySK38C1jBdLwDsNWKzzBHqKYEE5Cgv-qjWvorUXk9fw, y: _LeQBw07cf5t57Iavn4j-BqJsAD1dpoz8gokd3sBsOo, d: vmGQv6YuWAXkb-8Z8t7dG-9n1dqjKCn1qiwHmBQ7pmA, kid: ec256-1, use: sig, alg: ES256 }注意x、y、d均为43 字符的 base64url 字符串32 字节这正是 P-256 曲线的典型特征。三、可选参数alg、ext、key_ops、kid、kty、use、x5c、x5t、x5t#S256、x5uJWK_EC_Private继承自 JWKParameters因此还携带一组通用 JWK 元数据。原文档将其全部列为 optional含义如下属性类型含义典型取值alg?stringJWK alg (Algorithm) 参数即该密钥允许使用的算法ES256、ES384、ES512、ECDH-ES等ext?booleanJWK ext (Extractable) 参数密钥是否可导出true/falsekey_ops?string[]JWK key_ops (Key Operations) 参数密钥允许的操作[sign]、[decrypt]、[unwrapKey]等kid?stringJWK kid (Key ID) 参数密钥标识符任意字符串用于 JWKS 中定位密钥kty?stringJWK kty (Key Type) 参数密钥类型对 EC 密钥通常写死为ECuse?stringJWK use (Public Key Use) 参数密钥用途sig签名或enc加密x5c?string[]JWK x5c (X.509 Certificate Chain) 参数base64 编码的 DER 证书链x5t?stringJWK x5t (X.509 Certificate SHA-1 Thumbprint) 参数base64url 的证书 SHA-1 指纹x5t#S256?stringJWK x5t#S256 (X.509 Certificate SHA-256 Thumbprint) 参数base64url 的证书 SHA-256 指纹x5u?stringJWK x5u (X.509 URL) 参数指向 X.509 证书的 URL3.1 kty 的处理类型收窄与 Web Crypto 约束kty在JWK_EC_Private中是可选字段但在实际使用中必须显式写为EC理由有二类型层面importJWK等 API 的入参类型是AnyJWK其中的JWK_EC_Private { kty: EC }分支要求字面量kty: EC否则 TypeScript 无法收窄到该分支运行时层面crypto.subtle.importKey(jwk, ...)会按kty决定解析方式见 src/lib/jwk_to_key.tskty缺失或与算法注册表不符时会抛出JOSENotSupported(Invalid or unsupported JWK alg (Algorithm) Parameter value)。3.2 alg 与 use 在导入时的行为在 src/lib/jwk_to_key.ts 的jwkToKey实现中当把 JWK 交给 Web Crypto 的importKey之前jose 会const keyData: types.JWK { ...jwk } if (keyData.kty ! AKP) { delete keyData.alg // 对 EC 密钥删除 alg } delete keyData.use // 删除 use即alg与use只是声明性元数据jose 在导入前将其剔除最终生效的算法与用途由 JWS/JWE 操作上下文jwtVerify、compactSign中指定的alg决定。因此alg与use是建议性信息主要用于 JWKS 交换与密钥选择真正决定密钥能否用于某算法的是 key_descriptor.ts 中每个算法的kty/crv约束以及 jose 的 key_ops 推导逻辑src/lib/jwk_to_key.ts。关于 Algorithm Key Requirements各alg对密钥形状的要求原文档引用了项目的 issue #210 讨论其结论已固化在key_descriptor.ts的minRsaBits、crv、kty等字段中。3.3 key_ops 与 ext 的运行时校验jose 在导入 JWK 前会先做元数据规范化src/lib/jwk_metadata.tsext必须是boolean否则抛TypeErrorkey_ops必须是字符串数组且元素唯一否则抛TypeError校验通过后key_ops会作为importKey的 usages 参数传入src/lib/jwk_to_key.ts。如果 JWK 未提供key_opsjose 会按算法注册表的默认用途推导例如 ES 系列私钥默认 usages 为[sign]公钥为[verify]src/lib/jws_algorithms.tsECDH 私钥默认[deriveBits]、公钥无 usagessrc/lib/jwe_algorithms.ts。3.4 X.509 证书相关参数x5c、x5t、x5t#S256、x5u用于把 JWK 与 X.509 证书关联起来X.509 Certificate Chain 等参数常用于 PKI 场景中证明密钥的归属与信任链。它们只是可选的声明性元数据jose 的 JWK 导入导出流程会原样透传这些字段但不会对它们做密码学校验。如果需要基于证书导入密钥应使用importX509见 docs/key/import/README.md。四、完整实战生成、导入、导出 EC 私钥 JWK4.1 用 generateKeyPair 生成 EC 密钥对import { generateKeyPair } from jose const { publicKey, privateKey } await generateKeyPair(ES256, { crv: P-256 })第一个参数是 JWA 算法标识符ES256/ES384/ES512第二个参数的crv指定曲线见 docs/key/generate_key_pair/README.md当crv与算法标识符隐含的曲线冲突时例如ES256配P-384jose 会抛出JOSENotSupportedsrc/key/generate_key_pair.ts。4.2 用 exportJWK 导出私钥 JWKimport { exportJWK } from jose const privateJwk await exportJWK(privateKey) console.log(privateJwk) // { // kty: EC, // crv: P-256, // x: ..., // y: ..., // d: ..., // }导出的对象即满足JWK_EC_Private的结构必含crv、x、y、d见 docs/key/export/README.md。exportJWK的实现位于 src/key/export.ts底层委托给keyToJWK完成 Web Crypto 的exportKey(jwk, ...)调用。4.3 用 importJWK 导入私钥 JWKimport { importJWK } from jose const privateKey await importJWK( { kty: EC, crv: P-256, x: ySK38C1jBdLwDsNWKzzBHqKYEE5Cgv-qjWvorUXk9fw, y: _LeQBw07cf5t57Iavn4j-BqJsAD1dpoz8gokd3sBsOo, d: vmGQv6YuWAXkb-8Z8t7dG-9n1dqjKCn1qiwHmBQ7pmA, kid: ec256-1, use: sig, alg: ES256, }, ES256, )要点见 docs/key/import/README.md传入的对象应满足JWK_EC_Private形状kty必须为EC第二个参数alg用于预校验密钥与算法的匹配性并决定返回密钥的算法注册项importJWK的底层链路为normalizeJwk元数据校验src/lib/jwk_metadata.ts→jwkToKey按算法注册表解析subtle参数并调用crypto.subtle.importKeysrc/lib/jwk_to_key.ts。4.4 导入后的典型用法签名new SignJWT({...}).setProtectedHeader({ alg: ES256 }).sign(privateKey)底层使用 ECDSA见 src/lib/jws_algorithms.ts解密jwtDecrypt(jwt, privateKey)若 JWE 头使用ECDH-ES系列私钥的deriveBits用于派生 CEK见 src/lib/key_management.ts 的曲线校验P-256/P-384/P-521。五、源码层面的安全与规范细节5.1 私钥识别逻辑jwkToKey通过!!(jwk.d || jwk.priv)判断密钥是否为私钥src/lib/jwk_to_key.ts并据此选择 usages私钥用usages[1]sign/decrypt/deriveBits公钥用usages[0]verify/encrypt。因此d的存在是 jose 判断 这是私钥 的唯一依据切勿在公钥 JWK 中误带d。5.2 私钥 JWK 的保密性d是私钥标量泄露d等于泄露全部私钥。实践建议私钥 JWK 只应保存在服务端密钥管理设施中不应随 JWT/JWS 报文或客户端代码分发需要对外暴露密钥标识时优先使用JWK ThumbprintRFC 7638从而在不泄露私钥的前提下为公钥生成稳定指纹import { calculateJwkThumbprint } from jose const thumbprint await calculateJwkThumbprint(privateJwk) // 只基于 crv/kty/x/y 计算与私钥部分无关5.3 JWKS 场景EC 私钥 JWK 通常不会直接放入公开的 JWKSJSON Web Key Set而是将其公钥部分JWK_EC_Public发布。jose 提供了createLocalJWKSet与createRemoteJWKSet供验证方按kid查找公钥见 docs/jwks/local/README.md私钥则留在签名/解密服务端。kid字段在此场景中承担了密钥路由的关键作用建议在生成密钥对时就为其分配唯一的kid。六、小结JWK_EC_Private是 jose 中 EC 私钥 JWK 的类型骨架crv、x、y、d四个必填字段承载密码学数据alg、use、key_ops、kid、ext及 X.509 相关字段提供元数据语义。理解这份接口能帮助你正确构造importJWK的入参kty: EC不可省略曲线必须在 P-256 / P-384 / P-521 内理解alg、use在 jose 中的声明性定位导入前会被剔除实际算法由操作上下文决定把握私钥的保密边界——d不出仓库、公钥指纹用 thumbprint、私钥与公钥分别放在签名方与验证方。如需深入可继续阅读 docs/types/interfaces/JWK_EC_Public.md、docs/key/import/README.md、docs/jwk/thumbprint/README.md以及仓库内的类型定义 src/types.d.ts 与密钥处理实现 src/lib/jwk_to_key.ts、src/lib/jwk_metadata.ts。赞分享网络安全认证鉴权后端【免费下载链接】joseJWA, JWS, JWE, JWT, JWK, JWKS for Node.js, Browser, Cloudflare Workers, Deno, Bun, and other Web-interoperable runtimes项目地址https://gitcode.com/gh_mirrors/jo/jose点击查看免费下载相关推荐atproto/jwk-jose基于 jose 库的 AT Protocol JWK 密钥实现解析atproto/jwk jose基于 jose 库的 AT Protocol JWK 密钥实现解析 导读 atproto/jwk jose 是 Blues后端社交cryptography 椭圆曲线密码学EC完整指南密钥生成、ECDSA 签名与 ECDH 密钥交换cryptography 椭圆曲线密码学EC完整指南密钥生成、ECDSA 签名与 ECDH 密钥交换 本文基于 cryptography 官方文档 ec.密码学jose 中 AKP 私钥 JWK 的类型定义与使用指南深入解析 JWK_AKP_Private 接口jose 中 AKP 私钥 JWK 的类型定义与使用指南深入解析 JWK_AKP_Private 接口 AKPAsymmetric Key Pair非对称网络安全认证鉴权后端上一篇AI小说创作终极指南5分钟本地部署开源工具下一篇如何永久保存微信聊天记录WeChatMsg完整上手教程三步导出聊天记录一键生成年度聊天报告创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表