Go JOSE 库实战指南:基于 go-jose/v4 的 JWE 加密、JWS 签名与算法选型详解
云原生DevOps运维【免费下载链接】devtronThe only Kubernetes dashboard you need项目地址https://gitcode.com/gh_mirrors/dev/devtron点击查看免费下载导读本文以 devtron 仓库所 vendored 的github.com/go-jose/go-jose/v4v4.1.4间接依赖为核心系统讲解 Go 语言中 JOSEJavaScript Object Signing and Encryption标准族——JSON Web EncryptionJWERFC 7516、JSON Web SignatureJWSRFC 7515、JSON Web TokenJWTRFC 7519的实现细节。读者将掌握 go-jose 的版本演进脉络、完整算法矩阵、密钥类型约束以及NewSigner/NewEncrypter构造与ParseSigned/ParseEncrypted解析验证的完整调用链能够为实际项目正确选型并规避多接收者、HMAC 密钥长度、解压上限等关键陷阱。一、go-jose 是什么JOSE 标准族的 Go 实现go-jose包的目标是为 JavaScript Object Signing and Encryption 系列标准提供完整实现包括JWEJSON Web EncryptionRFC 7516将消息内容加密后以 JSON 形式传输保证机密性JWSJSON Web SignatureRFC 7515对消息内容签名/做 MAC保证完整性、不可否认性与来源可信JWTJSON Web TokenRFC 7519在 JWS/JWE 之上的声明型令牌格式由独立的jwt子包提供支持包注释见 vendor/github.com/go-jose/go-jose/v4/doc.go。库同时支持**紧凑序列化Compact Serialization与JWS/JWE JSON 序列化两种格式并可选的多接收者multiple recipients**模式此外还附带一个用于在 shell 中处理 JOSE 消息的命令行小工具jose-util。1.1 序列化格式紧凑与 JSON 两套表达从源码可以看到go-jose 对两种序列化格式统一入口、自动分派ParseSigned会先剥离空白字符若输入以{开头则走 JSON 序列化解析ParseSignedJSON否则走紧凑序列化解析parseSignedCompact见 vendor/github.com/go-jose/go-jose/v4/jws.goParseEncrypted同样根据是否以{开头分别调用ParseEncryptedJSON与ParseEncryptedCompact见 vendor/github.com/go-jose/go-jose/v4/jwe.go。紧凑序列化形如header.payload.signatureJWS或header.encrypted_key.iv.ciphertext.tagJWE适合 URL 安全场景JSON 序列化则允许携带未受保护unprotected的头部字段与多接收者结构。1.2 编码细节fork 自标准库的大小写敏感 JSON 解析go-jose 使用了 Go 标准库encoding/json的一个fork 版本github.com/go-jose/go-jose/v4/json其对成员名采用大小写敏感匹配而非标准库默认的大小写不敏感匹配。这是为了避免 go-jose 与其他语言实现之间对消息产生不同的解读——JOSE 头部参数如alg、enc、kid严格区分大小写大小写不敏感的解析可能导致跨语言互操作歧义。这是使用该库时必须了解的一个底层特性。二、版本演进为何选择 v4README 明确了各版本的维护状态这直接决定依赖选型版本状态说明v4当前稳定版import github.com/go-jose/go-jose/v4支持当前及上一个 Golang 发布版本目前要求 Go 1.24v5即将发布携带多个破坏性 API 变更需要 Go 1.25 并以GOEXPERIMENTjsonv2构建使用encoding/json/v2v3仅接受关键安全更新官方建议迁移到 v4v1 / v2已废弃可在旧仓库square/go-jose中找到在 devtron 仓库中该依赖以github.com/go-jose/go-jose/v4 v4.1.4形式声明于 go.mod并作为间接依赖// indirect被 vendored 到vendor/github.com/go-jose/go-jose/v4/。这意味着在实际使用中应确保 Go 工具链版本满足 v4 的要求Go 1.24 及以上。三、支持的算法矩阵核心选型依据go-jose 的算法标识符尽可能与JSON Web AlgorithmsRFC 7518标准保持一致所有常量定义集中在 vendor/github.com/go-jose/go-jose/v4/shared.go。以下是 README 给出的完整算法表并标注了常量名与底层密码学原语3.1 密钥加密算法Key EncryptionJWE 的alg密钥加密方式算法标识符对应源码常量RSA-PKCS#1v1.5RSA1_5RSA1_5RSA-OAEPRSA-OAEP、RSA-OAEP-256RSA_OAEPSHA-1、RSA_OAEP_256SHA-256AES 密钥包装A128KW、A192KW、A256KWA128KW、A192KW、A256KWAES-GCM 密钥包装A128GCMKW、A192GCMKW、A256GCMKWA128GCMKW、A192GCMKW、A256GCMKWECDH-ES AES 密钥包装ECDH-ESA128KW、ECDH-ESA192KW、ECDH-ESA256KWECDH_ES_A128KW、ECDH_ES_A192KW、ECDH_ES_A256KWECDH-ES直接ECDH-ES¹ECDH_ES直接加密dir¹DIRECT¹ 这两个算法不支持多接收者模式详见下文 6.3 节。此外库还额外支持基于口令的 PBES2 系列PBES2-HS256A128KW、PBES2-HS384A192KW、PBES2-HS512A256KW常量定义于shared.go对应 JWE 头部参数p2c迭代次数与p2s盐值。3.2 签名 / MAC 算法JWS 的alg签名方式算法标识符RSASSA-PKCS#1v1.5RS256、RS384、RS512RSASSA-PSSPS256、PS384、PS512HMACHS256、HS384、HS512ECDSAES256、ES384、ES512Ed25519EdDSA²² README 注明EdDSA仅在该包的 v2 及以上版本中可用当前 v4 完全支持。3.3 内容加密算法Content EncryptionJWE 的enc内容加密方式算法标识符AES-CBC HMACA128CBC-HS256、A192CBC-HS384、A256CBC-HS512AES-GCMA128GCM、A192GCM、A256GCM3.4 压缩算法压缩方式算法标识符DEFLATERFC 1951DEFshared.go中对应常量NONE空串不压缩与DEFLATE。压缩仅允许出现在 JWE 的受保护头部zip参数中解密时由Decrypt自动解压。四、支持的密钥类型库能直接理解以下 Go 原生密钥类型可传给NewEncrypter、NewSigner等构造函数。每种密钥也都可以包装进JWKJSON Web Key从而附带kid密钥 ID等元信息适用算法对应 Go 类型RSA*rsa.PublicKey、*rsa.PrivateKeyECDH、ECDSA*ecdsa.PublicKey、*ecdsa.PrivateKeyEdDSA¹ed25519.PublicKey、ed25519.PrivateKeyAES、HMAC[]byte对称密钥¹ 仅在该包 v2 及以上版本可用。源码中JSONWebKey结构体见 vendor/github.com/go-jose/go-jose/v4/jwk.go的Key字段可承载上述全部类型并支持KeyID、Algorithm、Use以及 X.509 证书链x5c、证书 URLx5u、证书指纹x5t/x5t#S256等字段序列化时kty会根据Key的 Go 类型自动推导无需手工指定。newVerifier与makeJWSRecipient的分派逻辑signing.go也证实了上述类型就是签名/验证路径的完整白名单未知类型会返回ErrUnsupportedKeyType。五、签名JWS从构造到验证的完整调用链5.1 构造签名器NewSigner / NewMultiSigner签名器通过NewSigner(sig SigningKey, opts *SignerOptions)创建底层委托给NewMultiSigner见 vendor/github.com/go-jose/go-jose/v4/signing.go。SigningKey由两部分组成signing.gotype SigningKey struct { Algorithm SignatureAlgorithm // 如 jose.HS256 / RS256 / ES256 Key interface{} // 私钥或 HMAC 对称密钥 }HMAC 密钥长度硬性要求若使用 HS 系列[]byte密钥长度不得小于对应哈希输出的字节数否则验证/签名路径会失败HS256至少 32 字节HS384至少 48 字节HS512至少 64 字节SignerOptions支持链式配置均定义于 signing.goWithHeader(k, v)向受保护头部注入任意扩展字段WithContentType(cty)设置cty头WithType(typ)设置typ头WithCritical(names...)声明crit关键头部集合WithBase64(false)禁用 payload 的 base64url 编码b64false同时自动将其加入crit另有EmbedJWK选项决定是否把公钥以jwk头内嵌进 JWS内嵌 JWK 与kid互斥这是库的有意设计以避免混淆。签名器接口Sign(payload []byte) (*JSONWebSignature, error)为每个接收者生成一条签名NonceSource接口可用于注入随机 nonce。5.2 解析与验证ParseSigned / Verify / VerifyMulti关键安全语义ParseSigned在解析阶段不验证签名——它只负责反序列化并校验alg是否在调用方传入的白名单signatureAlgorithms内。必须显式调用Verify()验证签名后才可信任 payloadjws.go 的文档注释明确强调这一点。// 解析自动识别紧凑或 JSON 序列化同时声明可接受的算法白名单 parsed, err : jose.ParseSigned(token, []jose.SignatureAlgorithm{jose.RS256}) if err ! nil { /* 算法不在白名单内则失败 */ } // 显式验证签名成功才返回可信 payload payload, err : parsed.Verify(publicKey) if err ! nil { /* 签名无效 */ }验证路径DetachedVerifysigning.go的实际流程为先尝试从kid定位 JWKS 中的密钥tryJWKS→ 按密钥类型构造payloadVerifier→ 检查 unprotected 头中不得出现critRFC 7515 §4.1.11 要求crit必须受完整性保护→ 检查受保护头中的crit是否全部受支持 → 计算认证数据computeAuthData→ 调用底层密码学原语验签。VerifyMulti面向多签名对象返回验证成功的签名索引、Signature结构与 payload确保调用方拿到的是“被验证过”的数据ParseDetached/DetachedVerify支持分离式detachedpayload 场景UnsafePayloadWithoutVerification可绕过验证取回 payload——不可信任仅供需要预先查看内容的场景使用。六、加密JWE构造、解析与解密的完整调用链6.1 构造加密器NewEncrypter / NewMultiEncrypterNewEncrypter(enc ContentEncryption, rcpt Recipient, opts *EncrypterOptions)vendor/github.com/go-jose/go-jose/v4/crypter.go依据Recipient.Algorithm分派不同实现dir直接加密要求密钥为[]byte且长度必须恰好等于内容加密算法的密钥长度如A256GCM需要 32 字节否则返回ErrInvalidKeySizeCEK 直接使用该静态密钥staticKeyGeneratorECDH-ES直接模式要求*ecdsa.PublicKey使用 ECDH 派生 CEKecKeyGenerator其余算法随机生成 CEKrandomKeyGenerator再对每个接收者执行密钥加密。Recipient结构体字段crypter.gotype Recipient struct { Algorithm KeyAlgorithm // 如 jose.RSA_OAEP / A256GKW Key interface{} // 公钥或 []byte 对称密钥类型必须与 Algorithm 匹配 KeyID string // 可选的密钥 ID PBES2Count int // PBES2 迭代次数缺省安全默认值 100000 PBES2Salt []byte // PBES2 盐值缺省自动生成 128 位随机盐 }EncrypterOptionscrypter.go支持Compression如jose.DEFLATE、ExtraHeaders以及链式方法WithHeader、WithContentType、WithType。加密器接口为type Encrypter interface { Encrypt(plaintext []byte) (*JSONWebEncryption, error) EncryptWithAuthData(plaintext []byte, aad []byte) (*JSONWebEncryption, error) Options() EncrypterOptions }其中EncryptWithAuthData允许携带额外的附加认证数据AAD对应 JWE 的aad成员该数据参与认证但不被加密。6.2 解析与解密ParseEncrypted / Decrypt / DecryptMultiParseEncrypted(input, keyEncryptionAlgorithms, contentEncryption)要求传入两个非空白名单alg密钥加密算法列表与enc内容加密算法列表解析后消息中任何头部含所有接收者出现白名单之外的算法都会失败jwe.go。Decrypt(decryptionKey)crypter.go的流程合并受保护/未受保护/接收者头部 → 检查crit→ 按kid从 JWKS 定位密钥 → 构造keyDecrypter→ 用enc选择contentCipher→ 解密出 CEK → 用 CEK 认证数据解密内容 → 若受保护头含zip则自动解压。解压安全上限Decrypt会自动解压明文字节但当解压后数据超过250kB 或压缩数据的 10 倍取较大者时会直接报错防止 zip 炸弹攻击DecryptMulti的对应上限为 250kB 或 3 倍。DecryptMulti面向多接收者 JWE返回成功解密的接收者索引、合并后的Header与明文。6.3 多接收者模式的限制NewMultiEncryptercrypter.go接受[]Recipient为多个接收者分别加密同一明文。但直接加密dir与 ECDH-ES无密钥包装不支持多接收者模式——在addRecipient中遇到这两个算法会直接返回错误crypter.go。原因也很直观直接模式下 CEK 就是静态密钥本身无法为不同接收者派生不同的加密密钥同理多签名NewMultiSigner则天然支持多个签名者。七、错误处理预定义错误常量go-jose 在 vendor/github.com/go-jose/go-jose/v4/shared.go 中定义了一组语义清晰的哨兵错误生产代码中可直接用errors.Is/判断错误触发场景ErrCryptoFailure密码学原语失败如认证标签无效、验签失败ErrUnsupportedAlgorithm选中了未实现的算法如构造不支持的加密器ErrUnsupportedKeyType密钥类型/格式不支持如多素数 RSA 私钥ErrInvalidKeySize密钥长度与算法不匹配如 AES-256 却传入 128 位密钥ErrNotSupported对象无法紧凑序列化紧凑格式表达不了的场景ErrUnprotectedNoncenonce 出现在未受保护头部ErrMissingX5cHeader消息中缺少x5c头ErrUnsupportedEllipticCurve不支持的椭圆曲线ErrUnsupportedCriticalHeader头部声明了crit但库不支持该扩展八、命令行为伴jose-util仓库随库发布一个命令行小工具jose-util可直接在 shell 中对 JOSE 消息进行签名、验证、加密、解密操作既是调试利器也是学习 JOSE 消息结构的活例子——生成一条 JWS/JWE 后用jwt.io之类工具解码观察其alg、enc、kid等头部参数能快速理解消息格式与算法对应关系。九、实战选型建议与安全清单结合 README 的算法矩阵与源码实现给出以下可直接落地的工程建议算法选型服务间令牌签名优先ES256或EdDSA小密钥、高性能与既有 RSA 体系互通时选RS256/PS256需要内容加密时A256GCM是默认推荐RSA1_5PKCS#1v1.5历史上存在 padding oracle 相关风险除非必须兼容旧系统否则避免使用。密钥长度HMAC 密钥严格按HS256≥32、HS384≥48、HS512≥64 字节准备dir模式的对称密钥长度必须与enc精确匹配。解析即白名单ParseSigned/ParseEncrypted务必显式传入算法白名单拒绝白名单外的任何算法防止算法混淆攻击。验证不可省略ParseSigned不验证签名必须调用Verify()/VerifyMulti()后再信任 payload多签名对象用VerifyMulti拿到“已验证”的数据而非直接读取Signatures。头部信任边界未受保护unprotected头部未被签名/加密保护默认不可信crit头只允许出现在受保护头部中。解压保护库内置 250kB/10 倍的解压上限无需额外自行处理但要意识到压缩存在放大攻击面。依赖版本当前应固定 v4 系列devtron 仓库使用 v4.1.4v5 有破坏性变更并依赖GOEXPERIMENTjsonv2v3 仅剩安全维护v1/v2 已废弃。十、在 devtron 项目中的位置在 devtron 仓库中go-jose 以vendored 间接依赖的形式存在go.mod 声明github.com/go-jose/go-jose/v4 v4.1.4源码完整保留于 vendor/github.com/go-jose/go-jose/v4/不参与主业务代码的直接调用而是支撑整个依赖树中更上层的安全与认证组件。阅读本文的读者可结合 vendor/github.com/go-jose/go-jose/v4/shared.go、crypter.go、signing.go、jws.go、jwe.go 与 jwk.go 等源码文件进一步追踪每条签名/加密链路的底层实现。赞分享云原生DevOps运维【免费下载链接】devtronThe only Kubernetes dashboard you need项目地址https://gitcode.com/gh_mirrors/dev/devtron点击查看免费下载相关推荐Go JOSE v4 实战指南基于 JWE / JWS / JWT 标准的 JSON 对象签名与加密实现Go JOSE v4 实战指南基于 JWE / JWS / JWT 标准的 JSON 对象签名与加密实现 导读 本文围绕 Buildah 仓库所 vendor云原生KubeSphere 中的 Go JOSEgo-jose v2JWE / JWS / JWT 加密签名库深度解析KubeSphere 中的 Go JOSEgo jose v2JWE / JWS / JWT 加密签名库深度解析 本文以 KubeSphere 仓库中 v后端云原生容器编排微服务Go JOSE v4 全解析在 vCluster 中实践 JWE / JWS / JWT 的签名、加密与密钥管理Go JOSE v4 全解析在 vCluster 中实践 JWE / JWS / JWT 的签名、加密与密钥管理 本文以 vCluster 仓库中 vendo云原生集群管理虚拟化多集群上一篇如何在浏览器中纯前端生成Word文档DOCX.js完整实现指南下一篇中兴光猫配置解密工具终极指南解锁运营商限制的完整教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

SAP清账原理与实操:从RFPOSX表到F-44失败排查

SAP清账原理与实操:从RFPOSX表到F-44失败排查

简介:本资源是一份面向SAP财务顾问、FI模块初学者及企业财务信息化实施人员的系统性教学课件,聚焦SAP财务模块中清账(Clearing)这一核心操作流程,深入解析未清项管理、账户间与同账户内清账逻辑、手工与自动清账适用场…

2026/10/14 2:53:29 阅读更多 →
中国30米高精度DEM优化方案:哥白尼GLO-30数据处理与精度验证

中国30米高精度DEM优化方案:哥白尼GLO-30数据处理与精度验证

做地形分析这些年,DEM选型一直是个容易让人纠结的问题。全球公开DEM里,ASTER、SRTM、ALOS、哥白尼都被不少人推荐过,可真落到中国区域的高精度地形应用上,我这两年固定用的还是哥白尼全球30米DEM(Copernicus DEM GLO-3…

2026/10/14 2:53:29 阅读更多 →
Python错题管理系统实战:Flask+SQLite完整开发指南

Python错题管理系统实战:Flask+SQLite完整开发指南

前阵子帮朋友做了一套基于Python的错题管理系统,从数据库设计到页面交互完整跑通,前后花了一周左右。这类系统在课程设计、毕业设计里出现频率非常高,工作里做学习类产品也经常用到,但网上找得到的教程大多停留在“能跑就行”的阶…

2026/10/14 2:52:29 阅读更多 →

最新新闻

DNA到蛋白质的完整路径:转录、翻译与中心法则的分子实战

DNA到蛋白质的完整路径:转录、翻译与中心法则的分子实战

DNA怎么变成蛋白质?这个问题的完整答案,比课本上那张中心法则的箭头要丰富得多。我当年第一次给学生讲清楚转录和翻译的全程时,最深的感受是:知识链条其实不长,但每一环都有大量“看似理所当然、实则经不起追问”的细节…

2026/10/14 3:40:38 阅读更多 →
基于CNN的水下声源定位实战:从数据到部署全流程

基于CNN的水下声源定位实战:从数据到部署全流程

简介:一套基于PyTorch的海洋水下声源定位实战项目,使用卷积神经网络(CNN)对水下声学信号进行建模,预测声源方位角与距离,完整覆盖从声学数据到位置估计的流程。资源面向水声工程、人工智能、电子信息、自动…

2026/10/14 3:40:38 阅读更多 →
Falcom经典游戏源码构建与调试实战指南

Falcom经典游戏源码构建与调试实战指南

简介:本资源为Falcom十大经典游戏系列的项目源码整理包,面向游戏开发初学者、JRPG爱好者及逆向分析兴趣者,提供一份轻量级参考素材,辅助理解经典日式RPG的设计脉络与基础架构逻辑。压缩包共3个文件,含1个HTML页面&…

2026/10/14 3:40:38 阅读更多 →
秋叶SD整合包V5.0代码版:从改代码到批量出图API实战

秋叶SD整合包V5.0代码版:从改代码到批量出图API实战

简介:秋叶SD整合包V5.0面向希望快速上手Stable Diffusion的Windows新手用户,解决环境配置繁琐、参数调节门槛高的问题。资源包共3个文件,以inscode工程配置、html页面与gitignore忽略规则为主,压缩包仅6KB,属于轻量级代…

2026/10/14 3:40:38 阅读更多 →
三站时差定位球面模型实战:从时差解算到经纬度

三站时差定位球面模型实战:从时差解算到经纬度

简介:这份资源围绕三站时差定位(TDOA)展开,面向无线通信、雷达定位与物联网设备追踪方向的学习者和开发者,重点解决无GPS覆盖环境下利用信号到达时间差解算信号源位置的问题。内容涉及Chan提出的球面TDOA实现思路&…

2026/10/14 3:40:38 阅读更多 →
一张图微调YOLOv11:自然栖息地鸟类检测的流程与扩充

一张图微调YOLOv11:自然栖息地鸟类检测的流程与扩充

简介:面向 YOLOv11 模型验证需求,这份精简版鸟类目标检测数据集包含一张真实野外鸟类图像及配套标准标注,可用于快速原型验证、轻量级部署测试与小样本检测基线建立。压缩包共五个文件,包含三张 JPG 图像、一个数据配置文件与一个…

2026/10/14 3:39:38 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →