新闻详情

新闻详情

首页 / 资讯中心 / 详情

jose 公共密钥导出实战:exportSPKI 函数详解与源码级原理剖析

发布时间:2026/11/16 0:19:40来源:尧图网络
jose 公共密钥导出实战:exportSPKI 函数详解与源码级原理剖析
网络安全认证鉴权后端【免费下载链接】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点击查看免费下载exportSPKI()是 jose 库中用于把公钥导出为PEM 编码的 SPKISubject Public Key Info字符串的核心函数覆盖 Node.js、浏览器、Cloudflare Workers、Deno、Bun 等所有 Web 互操作运行时。本文将以 exportSPKI 官方文档 为骨架结合 导出实现源码 与 ASN.1/PEM 底层处理完整讲解它的签名、参数、返回值、典型用法、内部实现链路与常见坑点帮助你把它安全、正确地应用到密钥分发、证书交换、互操作测试等真实场景中。函数签名与导出入口exportSPKI的完整签名如下exportSPKI(key): Promisestring输入一个公钥CryptoKey输出Promisestring即 PEM 编码的 SPKI 字符串。按照 源码注释 的说明该函数作为**命名导出named export**同时出现在两个入口主模块入口jose子路径导出jose/key/export。因此你可以按需选择导入方式// 方式一从主入口导入 import { exportSPKI } from jose // 方式二从子路径导入 import { exportSPKI } from jose/key/export主入口的统一导出在 src/index.ts 中可以找到印证export { exportPKCS8, exportSPKI, exportJWK } from ./key/export.js。官方导出函数的完整清单见 docs/key/export/README.md其中包含exportJWK、exportPKCS8、exportSPKI三个导出函数。参数说明参数类型说明keyCryptoKey要导出为 PEM 编码 SPKI 字符串的公钥key参数支持两种运行时密钥对象二选一传入即可CryptoKeyWeb Crypto API 标准密钥对象在浏览器、Workers、Deno、Bun 以及 Node.js 的 WebCrypto 接口中普遍使用KeyObjectNode.jsnode:crypto模块的原生密钥对象例如通过crypto.createPublicKey()得到仅在 Node.js 运行时可用。其类型定义可参考 docs/types/interfaces/KeyObject.md。返回值PEM 编码的 SPKI 字符串函数返回Promisestringresolve 为一个标准 PEM 格式的 SPKI 字符串。典型输出形如-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA... -----END PUBLIC KEY-----PEM 文本由formatPEM助手生成其实现见 src/lib/asn1.ts把 Base64 编码的密钥字节按每 64 个字符换一行b64.match(/.{1,64}/g) || []再包裹上-----BEGIN PUBLIC KEY-----与-----END PUBLIC KEY-----头尾标记。基础用法示例官方文档 exportSPKI 示例 给出了最直接的用法const spkiPem await jose.exportSPKI(publicKey) console.log(spkiPem)输出即上文展示的 PEM 字符串。这段代码可以进一步组合成完整的生成密钥对 → 导出 SPKI链路见下文实战小节。源码实现exportSPKI 的底层导出链路exportSPKI本身是一个极薄的封装src/key/export.ts 中它直接委托给从 src/lib/asn1.ts 导入的toSPKIexport function exportSPKI(key: types.CryptoKey | types.KeyObject): Promisestring { return exportPublic(key) }而toSPKI是通用导出函数genericExport(public, spki, key)的别名见 src/lib/asn1.ts。genericExport的完整流程src/lib/asn1.ts如下KeyObject 分支校验key.type ! public时抛出TypeError(key is not a public key)通过key.export({ format: pem, type: spki })直接获得 PEM 字符串这是 Node.jsnode:crypto原生能力。CryptoKey 分支先校验非密钥类型输入!isCryptoKey(key)时抛出invalidKeyInput生成的TypeError仅接受CryptoKey或KeyObject校验key.extractable ! true不可提取non-extractable的 CryptoKey 会抛出TypeError(CryptoKey is not extractable)校验key.type ! public抛出TypeError(key is not a public key)调用 Web Crypto 标准接口crypto.subtle.exportKey(spki, key)得到 DER 字节ArrayBuffer用encodeBase64编码为 Base64交给formatPEM生成 PEM 文本。从源码结构可以推断整个导出过程是运行时原生导出KeyObject 直接给 PEMCryptoKey 给 DER jose 统一格式化为 PEM的组合jose 保证了两种密钥对象最终输出完全一致的 PEM SPKI 文本。实战生成密钥对并导出 SPKI由于 Web Crypto 的generateKey默认extractable为false导出公钥前需要显式声明可提取。参考 GenerateKeyPairOptions.extractable 示例对应实现 src/key/generate_key_pair.ts完整的生成 → 导出流程如下import { generateKeyPair, exportSPKI } from jose // 生成 PS256 密钥对并将公/私钥标记为可提取 const { publicKey } await jose.generateKeyPair(PS256, { extractable: true, }) // 导出 PEM 编码的 SPKI 公钥 const spkiPem await jose.exportSPKI(publicKey) console.log(spkiPem)同样地私钥对应的 PEM 导出使用exportPKCS8见 exportPKCS8 文档JWK 格式导出使用exportJWK见 exportJWK 文档const { publicKey, privateKey } await jose.generateKeyPair(PS256, { extractable: true, }) const spkiPem await jose.exportSPKI(publicKey) // 公钥 → SPKI PEM const pkcs8Pem await jose.exportPKCS8(privateKey) // 私钥 → PKCS8 PEM const publicJwk await jose.exportJWK(publicKey) // 公钥 → JWK与 importSPKI 的往返互操作exportSPKI与导入侧函数importSPKI见 importSPKI 文档互为逆操作可用于密钥的持久化存储、跨进程/跨服务传输以及互操作测试。导入侧实现同样位于 src/lib/asn1.ts通过正则剥离 PEM 头尾与空白后解码 Base64import { exportSPKI, importSPKI } from jose // 导出 const spkiPem await jose.exportSPKI(publicKey) // 存盘或传输... 之后重新导入 const importedKey await jose.importSPKI(spkiPem, PS256, { extractable: true, })仓库的互操作测试 tap/pem.ts 对该往返做了严格验证对多种算法RSA、EC、OKP、ML-DSA 等的 PEM 向量先importSPKI再exportSPKI将导出的 PEM 规范化normalize后与原始 PEM逐字节相等t.strictEqual(...)在 Node.js 环境下还会额外验证node:crypto的createPublicKey()导出的 KeyObject 与 WebCrypto 导出的结果一致。这意味着 SPKI PEM 在不同运行时、不同密钥对象形态之间是稳定可互换的。常见错误与注意事项结合 src/lib/asn1.ts 中的校验逻辑以下是调用exportSPKI时最可能遇到的错误场景错误场景抛出的异常原因传入私钥key.type privateTypeError(key is not a public key)SPKI 仅描述公钥结构私钥应使用exportPKCS8传入不可提取的 CryptoKeyTypeError(CryptoKey is not extractable)密钥未以extractable: true生成/导入传入不支持的输入类型TypeError(...)由invalidKeyInput生成仅接受CryptoKey与KeyObject其余类型会被拒绝使用建议生成密钥时记得设置extractable: true否则导出会失败从安全角度仅对需要公开分发的公钥开启可提取私钥是否可提取需结合业务风险评估公钥导出请用exportSPKI私钥导出请用exportPKCS8两者输出分别以-----BEGIN PUBLIC KEY-----和-----BEGIN PRIVATE KEY-----开头便于区分在 Node.js 中来自node:crypto的 KeyObject 与来自subtle.generateKey的 CryptoKey 都可以传给exportSPKI结果一致浏览器等纯 Web Crypto 环境则只能使用 CryptoKey。小结exportSPKI是 jose 密钥导出三件套exportSPKI/exportPKCS8/exportJWK中的公钥 PEM 导出入口它屏蔽了 KeyObject 与 CryptoKey 两种底层密钥对象的差异统一输出标准 PEM 编码的 SPKI 字符串可用于公钥分发、证书互操作和跨运行时密钥交换。其实现链路 src/key/export.ts → src/lib/asn1.ts 清晰可读并有 tap/pem.ts 的往返一致性测试兜底可放心在各类 Web 互操作运行时中使用。赞分享网络安全认证鉴权后端【免费下载链接】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点击查看免费下载相关推荐Faker 日本媒体模块实战使用 Faker::JapaneseMedia::Doraemon 生成哆啦A梦主题假数据Faker 日本媒体模块实战使用 Faker::JapaneseMedia::Doraemon 生成哆啦A梦主题假数据 本指南围绕 Faker 项目日本媒体网络安全认证鉴权后端scalar/highlight 源码级解析Scalar 零依赖高性能语法高亮引擎与 40 种语言语法体系scalar/highlight 源码级解析Scalar 零依赖高性能语法高亮引擎与 40 种语言语法体系 本篇技术指南围绕 Scalar 开源仓库中的代码网络安全认证鉴权后端Electron SharedTextureImportTextureInfo共享纹理导入对象详解与源码级原理剖析Electron SharedTextureImportTextureInfo共享纹理导入对象详解与源码级原理剖析 本文围绕 Electron 的 Share桌面应用跨平台前端上一篇从特征提取到图像嵌入regnety_320.seer_ft_in1k的3大实战应用场景下一篇Klavis Firecrawl Deep Research MCP Server为 AI Agent 接入深度网络研究的实现与实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/15 4:54:16

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/15 2:04:12

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/14 10:11:15

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/14 17:14:38

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/14 16:35:50

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/15 4:06:36

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉