Go JOSE v4 实战指南:基于 JWE / JWS / JWT 标准的 JSON 对象签名与加密实现
云原生【免费下载链接】buildahA tool that facilitates building OCI images.项目地址https://gitcode.com/gh_mirrors/bu/buildah点击查看免费下载导读本文围绕 Buildah 仓库所 vendored 的go-josev4 文档系统讲解 Go 语言中实现JSON Web EncryptionJWE、JSON Web SignatureJWS与JSON Web TokenJWT三大 IETF 标准的核心库go-jose。你将掌握该库支持的算法与密钥类型全集、签名/加密的典型调用方式、多接收者模式的约束以及它在容器签名与内容信任链路中的实际定位从而能够在自己的 Go 项目中正确选型与使用 JOSE 消息格式。一、库定位Javascript Object Signing and EncryptionJOSE标准族go-jose的目标是在 Go 语言中完整实现Javascript Object Signing and Encryption系列标准核心覆盖三大规范JSON Web EncryptionJWE——RFC 7516对 JSON 承载的数据进行加密JSON Web SignatureJWS——RFC 7515对 JSON 承载的数据进行数字签名与 MACJSON Web TokenJWT——RFC 7519在 JWS / JWE 之上定义的令牌载体格式。从 doc.go 的包级注释可以看到库同时支持compact 序列化与JWS/JWE JSON 序列化两种消息格式并可选支持多接收者multiple recipients模式。此外还附带一个小型命令行工具jose-util可在 shell 中直接处理 JOSE 消息便于调试与教学。值得特别注意的是一个实现细节go-jose 使用了一份从 Go 标准库 fork 出来的encoding/json实现位于仓库内 json 子目录它采用大小写敏感的成员名匹配而非标准库的忽略大小写匹配。这样做的目的是避免 go-jose 与其他语言实现的库在解释消息字段时产生差异从而保证跨语言互操作时的行为一致。二、版本选择v4 是当前稳定版本该文档对版本策略有明确说明这也是选型时首先要确认的事项Version 4当前稳定版import github.com/go-jose/go-jose/v4支持当前及前一个 Go release当前要求Go 1.24Version 3仅接收关键安全更新官方建议迁移到 v4Version 1 与 2已废弃可在旧仓库square/go-jose中找到Version 5预告将引入若干破坏性 API 变更并依赖 Go 标准库新的encoding/json/v2该版本目前需要 Go 1.25 且以GOEXPERIMENTjsonv2构建。在 Buildah 仓库中go-jose以v4.1.5的版本被 vendored模块声明见 go.modgithub.com/go-jose/go-jose/v4 v4.1.5 // indirectvendor 清单见 modules.txt被 vendored 的包包括主包jose、jose/cipher与jose/json三个导入路径。也就是说本文讲解的正是当前仓库实际落地使用的稳定版本。三、支持的算法全集RFC 7518 JSON Web Algorithms算法标识符与 RFC 7518 JSON Web Algorithms 标准中的名称保持一致。完整继承文档中的四张算法表如下。3.1 密钥加密Key Encryption算法密钥加密方式算法标识符RSA-PKCS#1v1.5RSA1_5RSA-OAEPRSA-OAEP, RSA-OAEP-256AES 密钥包裹A128KW, A192KW, A256KWAES-GCM 密钥包裹A128GCMKW, A192GCMKW, A256GCMKWECDH-ES AES 密钥包裹ECDH-ESA128KW, ECDH-ESA192KW, ECDH-ESA256KWECDH-ES直接ECDH-ES1直接加密dir11. ECDH-ES直接与 dir直接加密两种模式不支持多接收者模式。3.2 签名 / MAC 算法签名 / MAC 方式算法标识符RSASSA-PKCS#1v1.5RS256, RS384, RS512RSASSA-PSSPS256, PS384, PS512HMACHS256, HS384, HS512ECDSAES256, ES384, ES512Ed25519EdDSA22. 文档在签名算法表中标注 EdDSA “仅在该库 version 2 中可用”而在后文密钥类型表中则表述为“version 2 或之后”结合本仓库 vendored 的 v4 代码asymmetric.go 中实现 EdDSA 相关逻辑可以确认v4 版本实际支持 Ed25519/EdDSA。引用时请以你实际使用的版本为准。3.3 内容加密Content Encryption算法内容加密方式算法标识符AES-CBC HMACA128CBC-HS256, A192CBC-HS384, A256CBC-HS512AES-GCMA128GCM, A192GCM, A256GCM3.4 压缩算法压缩方式算法标识符DEFLATERFC 1951DEF从源码结构看cipher 子目录中的 cbc_hmac.goAES-CBCHMAC 组合模式、concat_kdf.goECDH-ES 的 Concat KDF 派生、ecdh_es.go 与 key_wrap.goAES 密钥包裹正是上述算法表的底层实现载体说明算法支持并非空头声明而是有对应的密码学原语实现支撑。四、支持的密钥类型这些密钥类型被库所理解可直接传给NewEncrypter或NewSigner等函数每种密钥也都可以按需包装成JWKJSON Web Key以附加密钥 IDkid。算法对应的 Go 类型RSA*rsa.PublicKey,*rsa.PrivateKeyECDH, ECDSA*ecdsa.PublicKey,*ecdsa.PrivateKeyEdDSA1ed25519.PublicKey,ed25519.PrivateKeyAES, HMAC[]byte1. 文档注明 EdDSA 自该库 version 2 或之后可用。JWK 的序列化/解析实现位于 jwk.go它负责在标准 Go 密钥类型与 JWK 的 JSON 表示之间转换并承载kid等元信息。五、核心 API 与典型使用方式该文档将代码示例指向 Godoc 参考与jose-util子目录而本仓库 vendored 的源码则提供了最直接的函数签名证据足以还原典型调用链。5.1 签名与验签NewSigner / NewMultiSigner / ParseSigned签名入口定义在 signing.gofunc NewSigner(sig SigningKey, opts *SignerOptions) (Signer, error) func NewMultiSigner(sigs []SigningKey, opts *SignerOptions) (Signer, error)NewSigner使用单个签名密钥构造Signer可配合SignerOptions如指定算法、附加kid等NewMultiSigner传入多个SigningKey一次签名可产出多份签名的 JWS是“多接收者”思想在签名侧的对偶实现。验签入口定义在 jws.gofunc ParseSigned(input string) (*JSONWebSignature, error) func ParseSignedCompact(input string, algs []SignatureAlgorithm) (*JSONWebSignature, error) func ParseSignedJSON(input string, algs []SignatureAlgorithm) (*JSONWebSignature, error)典型流程NewSigner构造签名器 → 对 payload 调用Sign生成 JWS 字符串 → 对方用ParseSigned或ParseSignedCompact解析 → 通过DetachedVerify/Verify校验签名。5.2 加密与解密NewEncrypter / NewMultiEncrypter / ParseEncrypted加密入口定义在 crypter.gofunc NewEncrypter(enc ContentEncryption, rcpt Recipient, opts *EncrypterOptions) (Encrypter, error) func NewMultiEncrypter(enc ContentEncryption, rcpts []Recipient, opts *EncrypterOptions) (Encrypter, error)第一个参数enc指定内容加密算法如A256GCM、A128CBC-HS256第二个参数rcpt/rcpts指定接收者即密钥加密算法与密钥如RSA-OAEP RSA 公钥NewMultiEncrypter支持多个接收者同一密文可分别用不同密钥加密对应文档所述的多接收者模式。解密入口定义在 jwe.gofunc ParseEncrypted(input string, keyIDAlg string) (*JSONWebEncryption, error) func ParseEncryptedJSON(input string, keyIDAlg string) (*JSONWebEncryption, error) func ParseEncryptedCompact(input string, keyIDAlg string) (*JSONWebEncryption, error)典型流程NewEncrypter构造加密器 →Encrypt生成 JWE → 对方用ParseEncrypted解析后调用Decrypt还原明文。需要重申的是ECDH-ES直接与dir两种密钥加密算法不支持多接收者模式在NewMultiEncrypter场景中应选用支持多接收者的算法。5.3 序列化格式小结综合 jws.go 与 jwe.go 的解析函数族可以归纳出三种入口形态Compact 形态ParseSignedCompact/ParseEncryptedCompact即base64url(header).base64url(payload).signature这种紧凑字符串最常用于 HTTP 头Authorization: Bearer ...等单行场景JSON 形态ParseSignedJSON/ParseEncryptedJSON对应 JWS/JWE 的 JSON 序列化便于承载多签名、多接收者等复杂结构通用形态ParseSigned/ParseEncrypted自动分派到上述两种格式。六、在 Buildah 仓库中的角色容器签名信任链的间接依赖go-jose并非 Buildah 直接调用的库而是以indirect间接依赖的形式出现在 go.mod 中。从依赖拓扑推断它经由sigstore系的签名工具链go.sum 中github.com/sigstore/fulcio、github.com/sigstore/sigstore等组件传递引入服务于镜像签名生成与验证、签名材料如cosign风格的签名负载等与内容信任相关的场景——这与 Buildah 作为 OCI 镜像构建工具在buildah push/buildah commit等流程中涉及签名与校验的能力相吻合。对于使用者而言这意味着在使用 Buildah 源码时无需直接 importgo-jose其 API 通过间接依赖被自动带入vendor 模式下由 vendor/modules.txt 锁定若你独立开发涉及 JOSE/JWT 的 Go 服务则可直接go get github.com/go-jose/go-jose/v4并使用上文列出的NewSigner/NewEncrypter/ParseSigned/ParseEncrypted等 API。七、使用注意事项与迁移建议区分“签名算法”与“内容加密算法”JWS 只解决完整性与真实性签名/MACJWE 才解决机密性加密JWT 则可基于两者之一承载声明。选型时先明确需求是防篡改还是防泄露。多接收者模式的算法限制ECDH-ES直接与dir不可用于多接收者多接收者加密时优先选择 RSA-OAEP、AES-KW、AES-GCMKW 或 ECDH-ESKW 族。大小写敏感 JSON 解析由于 go-jose fork 的 json 实现按成员名大小写敏感匹配消息字段命名必须严格符合标准拼写如alg、typ、kid跨语言互操作时尤其要注意。版本迁移v3 仅接收关键安全更新v1/v2 已废弃新项目应直接使用 v4关注未来 v5 的破坏性 API 变更其依赖 Go 1.25 GOEXPERIMENTjsonv2构建的encoding/json/v2迁移前先评估工具链兼容性。安全实践优先选择 AEAD 类内容加密算法如 AES-GCM并配合现代密钥加密算法如 RSA-OAEP-256RSA1_5属于历史兼容算法在满足互操作要求的前提下应谨慎使用。结语go-jose是 Go 生态中实现 JOSE 标准族的主流选择它以 RFC 7515/7516/7519/7518 为规范依据覆盖完整的密钥加密、签名/MAC、内容加密与压缩算法矩阵同时支持 compact 与 JSON 两种序列化形态。本文依据 README.md 的算法与密钥表格结合仓库内 signing.go、crypter.go、jws.go、jwe.go 等源码还原了其 API 入口与使用要点。对于 Buildah 的开发者理解这份依赖有助于深入排查镜像签名与内容信任链路对于独立 Go 开发者上述 API 与表格可直接用于 JWE/JWS/JWT 的落地实现。赞分享云原生【免费下载链接】buildahA tool that facilitates building OCI images.项目地址https://gitcode.com/gh_mirrors/bu/buildah点击查看免费下载相关推荐go-jose v4 完整指南在 Go 中实现 JWE / JWS / JWT 的标准级加密与签名go jose v4 完整指南在 Go 中实现 JWE / JWS / JWT 的标准级加密与签名 本指南以当前仓库中 vendor 化的 go jose v人工智能AI AgentAgent 沙箱云原生容器运行时零信任go-jose v4 完全指南用 Go 实现 JWE/JWS/JWT 签名与加密go jose v4 完全指南用 Go 实现 JWE/JWS/JWT 签名与加密 导读 go jose Go JOSE是 Go 生态中最常用的 JSON容器运行时云原生CLIgo-jose v4 完全指南在 Go 中实现 JWE 加密、JWS 签名与 JWT 的实战解析go jose v4 完全指南在 Go 中实现 JWE 加密、JWS 签名与 JWT 的实战解析 go jose 是 Go 语言对 JavaScript Ob网络安全上一篇NeteaseMusic开发者指南API集成与双平台资源融合实现下一篇Checkov内存泄漏排查大规模扫描稳定性保障创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考