HarmonyOS 数据传输加密——从 HTTPS 到 DSoftBus 的实战全解
文章目录每日一句正能量一、引言为什么数据传输加密是应用的生死线二、HarmonyOS 数据传输加密整体架构三、HTTPS/TLS 安全传输实战3.1 TLS 1.3 握手流程3.2 基础 HTTPS 请求3.3 TLS 版本与加密套件配置四、证书固定Certificate Pinning4.1 为什么需要证书固定4.2 实现证书固定五、双向 TLSmTLS5.1 双向 TLS 原理5.2 HarmonyOS 实现双向 TLS六、分布式软总线DSoftBus安全传输6.1 DSoftBus 安全架构6.2 DSoftBus 安全传输代码示例七、WebSocket 安全传输八、网络安全配置最佳实践8.1 network_config.json 完整配置8.2 安全传输方案选型九、踩坑记录与常见问题坑1混合内容Mixed Content坑2证书固定过于严格坑3忽略证书过期坑4DSoftBus 未绑定设备坑5TLS 1.3 兼容性问题坑6WebSocket 心跳缺失十、总结每日一句正能量学会翻篇也就是学会及时止损。沉溺于过去无论是悔恨还是不甘都是在用今天的时间为昨天的成本付费。真正的翻篇不是遗忘而是接受是停止用今天的宝贵能量去浇灌昨天的枯枝。你的时间、精力和心情才是最值得投资的资产。一、引言为什么数据传输加密是应用的生死线在万物互联时代数据在传输过程中面临的威胁远比存储时更复杂。公共 Wi-Fi 中的中间人攻击、DNS 劫持、伪造 CA 证书、ARP 欺骗……每一种攻击手段都能在用户毫无察觉的情况下窃取敏感信息。据统计超过 60% 的移动应用数据泄露事件发生在传输环节而非存储环节。HarmonyOS 为开发者提供了从云端 HTTPS 通信到跨设备 DSoftBus 传输的全链路加密方案。本文将从 TLS 1.3 握手原理出发深入讲解证书固定、双向 TLS、分布式软总线安全传输等核心技术并给出可直接落地的生产级代码。二、HarmonyOS 数据传输加密整体架构HarmonyOS 的数据传输安全体系分为四层应用层业务代码发起 HTTPS 请求、WebSocket 连接或 DSoftBus 跨设备调用传输加密层TLS 1.2/1.3 提供传输层加密证书固定SSL Pinning防止 CA 被攻破双向 TLSmTLS实现双向身份认证网络通信层ohos.net.http模块处理 HTTP/HTTPS 请求DSoftBus 处理跨设备分布式通信WebSocket 处理实时推送安全基础设施层系统预置根证书库完成证书链校验TEE 可信执行环境保护密钥协商过程。这一架构的核心优势在于分层解耦——开发者无需关心底层加密细节只需在正确的层级配置正确的安全策略。三、HTTPS/TLS 安全传输实战3.1 TLS 1.3 握手流程TLS 1.3 相比 TLS 1.2 有三大革命性改进1-RTT 握手仅需一次往返即可完成握手TLS 1.2 需要 2-RTT延迟降低 50%前向安全支持 0-RTT 会话恢复同时保证前向安全性——即使长期私钥泄露历史会话也无法解密废弃不安全算法彻底移除 RSA 密钥交换、MD5/SHA-1 签名、CBC 模式等存在已知漏洞的算法仅保留 ECDHE AEADAES-GCM / ChaCha20-Poly1305。3.2 基础 HTTPS 请求HarmonyOS 通过ohos.net.http模块提供 HTTPS 支持默认启用证书校验importhttpfromohos.net.http;import{BusinessError}fromkit.BasicServicesKit;/** * 安全的 HTTPS GET 请求 */asyncfunctionsecureGet(url:string):Promisestring{consthttpRequesthttp.createHttp();try{constresponseawaithttpRequest.request(url,{method:http.RequestMethod.GET,header:{Content-Type:application/json,Accept:application/json},// 默认 sslVerify true必须保持开启// 生产环境绝对不要设置为 false});if(response.responseCode200){returnresponse.resultasstring;}else{thrownewError(HTTP${response.responseCode});}}catch(error){consteerrorasBusinessError;// 证书校验失败会抛出特定错误码if(e.code2300001||e.message?.includes(certificate)){console.error(证书校验失败可能遭受中间人攻击);}throwerror;}finally{httpRequest.destroy();}}致命陷阱某些开发者在调试时为了绕过自签名证书问题会设置sslVerify: false。这在生产环境中是绝对禁止的——一旦用户连接到攻击者控制的 Wi-Fi所有 HTTPS 流量将被明文劫持。3.3 TLS 版本与加密套件配置HarmonyOS 支持细粒度的 TLS 安全配置开发者应强制使用 TLS 1.2 及以上版本importhttpfromohos.net.http;/** * 创建高安全级别的 HTTP 请求 */functioncreateSecureHttpRequest():http.HttpRequest{consthttpRequesthttp.createHttp();// HarmonyOS 6 支持的安全配置选项constsecurityOptions:http.HttpSecurityOptions{// 最低 TLS 版本拒绝 TLS 1.0/1.1minTlsVersion:http.TlsVersion.TLS_V1_2,// 最高 TLS 版本maxTlsVersion:http.TlsVersion.TLS_V1_3,// 允许的加密套件仅保留安全套件cipherSuites:[TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_CHACHA20_POLY1305_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384],// 严格校验证书域名verifyHostname:true};returnhttpRequest;}四、证书固定Certificate Pinning4.1 为什么需要证书固定标准 HTTPS 依赖操作系统预置的根 CA 证书链来验证服务器身份。但如果 CA 机构被攻破如 2011 年 DigiNotar 事件或者用户设备被恶意安装了根证书攻击者就能签发合法的服务器证书实施中间人攻击。证书固定将信任锚点从任意受信 CA缩小到特定的证书或公钥——即使攻击者拥有合法 CA 的私钥也无法通过证书校验。4.2 实现证书固定HarmonyOS 支持在network_config.json中配置证书固定{network-security-config:{domain-config:[{domain:[{include-subdomains:true,name:api.example.com}],pin-set:{expiration:2027-01-01,pin:[{digest:SHA-256,value:sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA},{digest:SHA-256,value:sha256/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB}]}}]}}在代码中动态校验证书指纹importhttpfromohos.net.http;// 预置的证书公钥 SHA-256 哈希Base64constTRUSTED_PINS:Mapstring,string[]newMap([[api.example.com,[sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,sha256/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB]],[cdn.example.com,[sha256/CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC]]]);/** * 带证书固定的 HTTPS 请求 */asyncfunctionpinnedRequest(url:string):Promisehttp.HttpResponse{consthttpRequesthttp.createHttp();// 注册证书校验回调httpRequest.on(headerReceive,(err,data){if(err){console.error(Header receive error:,err);return;}// 获取证书指纹constcertFingerprintdata.getCertificateFingerprint?.();consthostnamenewURL(url).hostname;constexpectedPinsTRUSTED_PINS.get(hostname);if(expectedPinscertFingerprint){constisValidexpectedPins.some(pincertFingerprint.includes(pin));if(!isValid){console.error(证书固定校验失败:${hostname});httpRequest.destroy();thrownewError(Certificate pinning failed);}console.info(证书固定校验通过:${hostname});}});try{returnawaithttpRequest.request(url,{method:http.RequestMethod.GET});}finally{httpRequest.destroy();}}证书固定的最佳实践至少固定两个公钥当前证书 备用证书避免证书轮换时服务中断使用公钥哈希而非证书哈希证书轮换时公钥通常不变减少维护成本设置过期时间expiration字段强制开发者定期更新固定配置防止使用过期证书备用降级策略证书固定校验失败时可降级到标准证书链校验需记录安全日志。五、双向 TLSmTLS5.1 双向 TLS 原理标准 HTTPS 中只有客户端校验服务器身份单向认证。在双向 TLS 中服务端也会校验客户端证书确保只有持有合法客户端证书的设备才能访问 API。mTLS 的典型应用场景IoT 设备接入防止未授权设备冒充合法设备接入云端企业内网 API确保只有公司配发的设备能访问内部服务微服务间通信服务网格Service Mesh中服务间的双向认证。5.2 HarmonyOS 实现双向 TLSimporthttpfromohos.net.http;/** * 配置双向 TLS 的 HTTP 请求 */asyncfunctionmtlsRequest(url:string):Promisehttp.HttpResponse{consthttpRequesthttp.createHttp();constmtlsOptions:http.HttpRequestOptions{method:http.RequestMethod.GET,// 客户端证书由服务端 CA 签发clientCert:{certPath:resources/rawfile/client.crt,keyPath:resources/rawfile/client.key,// 如果私钥有密码保护keyPassword:},// 服务端 CA 证书用于校验服务端caPath:resources/rawfile/server_ca.crt,// 强制校验服务端证书sslVerify:true};try{returnawaithttpRequest.request(url,mtlsOptions);}finally{httpRequest.destroy();}}mTLS 的证书管理要点客户端证书应通过安全通道如设备出厂预置、OTA 安全更新下发禁止硬编码在应用中证书有效期不宜过长建议 1 年到期前通过证书轮换机制更新服务端需维护证书吊销列表CRL或支持 OCSP stapling及时阻断已泄露的客户端证书。六、分布式软总线DSoftBus安全传输6.1 DSoftBus 安全架构DSoftBus 是 HarmonyOS 实现超级终端的核心组件其安全传输流程包含六个阶段设备发现通过 CoAP 广播或 BLE 广播发现周边设备交换设备基本信息设备认证基于证书的双向认证 ECDHE 密钥协商确保通信双方身份可信组网建立LNNLocal Network Node分配 networkId设备加入分布式账本通道协商通过 UDP 协商 QoS 参数根据业务需求选择 TCP/UDP/流通道数据加密传输使用 AES-GCM 对数据进行端到端加密密钥由 TEE 保护会话关闭业务主动调用Shutdown释放资源清理会话密钥。6.2 DSoftBus 安全传输代码示例import{distributedDeviceManager}fromkit.DistributedServiceKit;import{socket}fromkit.DistributedServiceKit;/** * 建立安全的 DSoftBus 连接 */asyncfunctionestablishSecureConnection(targetNetworkId:string):Promisenumber{// 1. 创建 SocketconstclientSocketsocket.constructSocket();// 2. 配置 QoS服务质量constqos:socket.QosTV[][{qos:socket.QosType.QOS_TYPE_MIN_BW,value:1024*1024},// 最小带宽 1MB/s{qos:socket.QosType.QOS_TYPE_MIN_LATENCY,value:50},// 最低延迟 50ms{qos:socket.QosType.QOS_TYPE_TRANS_RELIABILITY,value:1}// 可靠传输];// 3. 配置回调constlistener:socket.ISocketListener{onBind:(socketId:number,peerInfo:socket.PeerSocketInfo){console.info(安全通道已建立: socketId${socketId}, peer${peerInfo.networkId});},onShutdown:(socketId:number,reason:socket.ShutdownReason){console.info(通道关闭: socketId${socketId}, reason${reason});},onBytes:(socketId:number,data:ArrayBuffer){// 接收加密后的字节数据DSoftBus 已自动解密constdecodernewTextDecoder();console.info(收到数据:${decoder.decode(data)});},onError:(socketId:number,errCode:number){console.error(通道错误: socketId${socketId}, err${errCode});}};// 4. 绑定建立安全连接// DSoftBus 会自动完成设备认证 - 密钥协商 - 加密通道建立constresultawaitsocket.bind(clientSocket,targetNetworkId,qos,listener);if(result!0){thrownewError(DSoftBus 连接失败:${result});}returnclientSocket;}/** * 发送加密数据 */asyncfunctionsendSecureData(socketId:number,data:string):Promisevoid{constencodernewTextEncoder();constbufferencoder.encode(data);// DSoftBus 会自动对数据进行 AES-GCM 加密后传输constresultawaitsocket.sendBytes(socketId,buffer);if(result!0){thrownewError(发送失败:${result});}console.info(加密数据已发送);}/** * 关闭安全连接 */asyncfunctioncloseSecureConnection(socketId:number):Promisevoid{socket.shutdown(socketId);console.info(安全通道已关闭会话密钥已清理);}DSoftBus 安全的核心保障设备绑定认证组网前必须完成设备绑定通过华为账号或扫码配对未绑定设备无法通信端到端加密数据在发送端加密、接收端解密中间节点包括路由器无法读取明文密钥不出 TEE会话密钥在 TEE 中协商和存储应用层无法导出多链路自适应根据网络环境自动在 Wi-Fi、蓝牙、NFC 间切换始终保持加密通道。七、WebSocket 安全传输对于实时通信场景如 IM、股票行情、游戏同步WebSocket 是比 HTTP 轮询更高效的选择。HarmonyOS 通过wss://WebSocket over TLS确保传输安全import{webSocket}fromkit.NetworkKit;/** * 建立安全的 WebSocket 连接 */functioncreateSecureWebSocket(url:string):webSocket.WebSocket{// 必须使用 wss:// 而非 ws://if(!url.startsWith(wss://)){thrownewError(WebSocket 必须使用 wss:// 协议);}constwswebSocket.createWebSocket();ws.on(open,(err,value){console.info(WebSocket 安全连接已建立);});ws.on(message,(err,value){console.info(收到消息:${value});});ws.on(close,(err,value){console.info(WebSocket 连接已关闭);});ws.on(error,(err){console.error(WebSocket 错误:,err);});// 连接自动使用 TLS 加密ws.connect(url);returnws;}WebSocket 安全要点强制 wss://生产环境绝对禁止 ws://明文传输心跳保活设置合理的心跳间隔防止连接被 NAT/防火墙断开消息签名对关键业务消息做 HMAC-SHA256 签名防止传输层解密后的应用层篡改。八、网络安全配置最佳实践8.1 network_config.json 完整配置{network-security-config:{base-config:{cleartext-traffic-permitted:false,trust-anchors:[{src:system}]},domain-config:[{domain:[{include-subdomains:true,name:api.example.com}],pin-set:{expiration:2027-06-01,pin:[{digest:SHA-256,value:sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA},{digest:SHA-256,value:sha256/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB}]},trust-anchors:[{src:system}]}]}}8.2 安全传输方案选型方案适用场景认证方式开发成本核心特点HTTPS (TLS 1.3)通用API请求标准TLS低证书链校验证书固定金融/支付/高安全应用级中防CA被攻破双向TLS (mTLS)IoT/企业内网双向认证高服务端验客户端DSoftBus加密跨设备分布式端到端中设备认证加密WebSocketTLS实时推送/IMwss协议低TLS over WS端到端加密(E2EE)隐私聊天/文件应用级高服务端无法解密九、踩坑记录与常见问题坑1混合内容Mixed Content在 HTTPS 页面中请求 HTTP 资源会被系统阻止。确保所有资源图片、API、WebSocket统一使用 HTTPS。坑2证书固定过于严格只固定一个证书公钥当服务器更换证书时所有客户端立即无法连接。务必预留至少一个备用公钥。坑3忽略证书过期未处理证书过期场景导致应用在某一天突然全部无法联网。建议实现证书过期预警机制。坑4DSoftBus 未绑定设备DSoftBus 通信前必须先完成设备绑定通过华为账号或扫码。未绑定设备调用bind会返回认证失败。坑5TLS 1.3 兼容性问题部分老旧服务端可能不支持 TLS 1.3。建议配置minTlsVersion: TLS_V1_2同时优先尝试 TLS 1.3。坑6WebSocket 心跳缺失长连接无心跳保活被运营商/NAT 断开。建议设置 30~60 秒心跳间隔。十、总结HarmonyOS 为数据传输安全提供了从云端到端侧、从单设备到分布式的完整解决方案通用 API 通信使用 HTTPS TLS 1.3强制证书校验禁用明文传输高安全场景叠加证书固定SSL Pinning将信任锚点从 CA 转移到应用自身IoT/企业场景使用双向 TLSmTLS服务端也校验客户端身份跨设备场景使用 DSoftBus享受自动设备认证 端到端加密 多链路自适应实时通信使用 wss:// 协议配合心跳保活和消息签名。数据传输安全的核心原则可以总结为一句话加密传输、校验身份、不信任任何中间节点。在 HarmonyOS 的安全架构支持下开发者只需在正确的位置配置正确的策略就能构建出经得起安全审计的应用。转载自https://blog.csdn.net/u014727709/article/details/163782657欢迎 点赞✍评论⭐收藏欢迎指正

相关新闻

MemSFT:大模型微调中灾难性遗忘与对齐税的解决方案

MemSFT:大模型微调中灾难性遗忘与对齐税的解决方案

如果你正在微调大语言模型,是否遇到过这样的困境:模型在新任务上表现越来越好,却在原本擅长的通用能力上“一落千丈”?或者,为了让模型学会“礼貌对话”,结果它连“112”都忘了? 这不是个例&am…

2026/10/20 4:16:37 阅读更多 →
【Spark内核】Spark Driver 的整体架构

【Spark内核】Spark Driver 的整体架构

一、先给一个总判断 Spark Driver 本质上是一个应用级控制中心。 Spark Driver 的架构,可以记成四步: 接入用户逻辑 → 分析依赖并拆 Stage → 调度 Task 并下发给 Executor → 收集反馈并推进或恢复执行再细一点就是 SparkContext:初始化和统…

2026/10/20 20:45:57 阅读更多 →
Codex 登录卡验证码?从网络环境到账号状态,一次讲清所有坑

Codex 登录卡验证码?从网络环境到账号状态,一次讲清所有坑

最近在社区里被问到好几次同一类问题:Codex 登录到一半,突然弹出一个添加电话号码的验证页面,账号在网页端聊天时使用一切正常,切到 Codex 就被拦下来;填入号码后,还可能收到 invalid_phone_number 一类的报…

2026/10/20 7:32:00 阅读更多 →

最新新闻

Jetson部署7B大模型实战:量化与内存优化全攻略

Jetson部署7B大模型实战:量化与内存优化全攻略

Jetson设备部署7B级别大语言模型,到底是不是一件“绝对可行”的事?我在Orin系列上折腾了一个多月,可以很负责任地说:可行,而且远没有想象中那么玄乎。只要把系统、内存和量化这三件事处理到位,qwen3.5这一代…

2026/10/21 3:36:26 阅读更多 →
Docker Compose 一键打包多技能 AI Agent 的实践与踩坑

Docker Compose 一键打包多技能 AI Agent 的实践与踩坑

最近帮一个内部小团队把散落一地的 AI 脚本收编成一套容器化服务,感觉这件事比写业务代码本身还值。团队里原本有做问答的、做知识库检索的、做文档摘要的,各自跑在个人笔记本上,Python 版本不一样、依赖互相冲突、模型 API 密钥散落在每个人…

2026/10/21 3:36:26 阅读更多 →
Android轻量级FTP服务器实现:纯Java无Root嵌入式文件服务

Android轻量级FTP服务器实现:纯Java无Root嵌入式文件服务

简介:本资源是一个基于 Apache FtpServer 实现的 Android 端轻量级 FTP 服务器 Demo,面向 Android 应用开发初学者与嵌入式网络服务实践者,解决在移动设备上快速搭建本地文件共享服务的实际需求,适用于局域网内调试、IoT 设备文件…

2026/10/21 3:36:26 阅读更多 →
UniHacker:2步激活全版本Unity的跨平台工具指南

UniHacker:2步激活全版本Unity的跨平台工具指南

UniHacker:2步激活全版本Unity的跨平台工具指南 【免费下载链接】UniHacker 为Windows、MacOS、Linux和Docker修补所有版本的Unity3D和UnityHub 项目地址: https://gitcode.com/GitHub_Trending/un/UniHacker 你花了一下午装好 Unity 2021,双击打…

2026/10/21 3:36:26 阅读更多 →
面向 OpenAPI 3.1 的 API 文档工程实战:agentic-awesome-skills 中 api-documenter 技能的能力图谱与落地指南

面向 OpenAPI 3.1 的 API 文档工程实战:agentic-awesome-skills 中 api-documenter 技能的能力图谱与落地指南

AI 技能AI 插件人工智能 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,600 agentic skills. Includes CLI, local MCP, c…

2026/10/21 3:36:26 阅读更多 →
提示工程与用户行为:用行为数据驱动提示词迭代优化

提示工程与用户行为:用行为数据驱动提示词迭代优化

2. 提示工程与用户行为:从"同一批次对话"里看出门道先聊个常见场景:你精心写好的提示词,在测试集上表现稳定,QA标了一堆好评,可一上线,用户的完读率、复购率就是上不去,后台还会时不时…

2026/10/21 3:35:26 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →