三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

HarmonyOS 数据传输加密——从 HTTPS 到 DSoftBus 的实战全解

HarmonyOS 数据传输加密——从 HTTPS 到 DSoftBus 的实战全解

文章目录

    • 每日一句正能量
    • 一、引言:为什么数据传输加密是应用的生死线
    • 二、HarmonyOS 数据传输加密整体架构
    • 三、HTTPS/TLS 安全传输实战
      • 3.1 TLS 1.3 握手流程
      • 3.2 基础 HTTPS 请求
      • 3.3 TLS 版本与加密套件配置
    • 四、证书固定(Certificate Pinning)
      • 4.1 为什么需要证书固定
      • 4.2 实现证书固定
    • 五、双向 TLS(mTLS)
      • 5.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:忽略证书过期
      • 坑4:DSoftBus 未绑定设备
      • 坑5:TLS 1.3 兼容性问题
      • 坑6:WebSocket 心跳缺失
    • 十、总结

每日一句正能量

学会翻篇,也就是学会及时止损。
沉溺于过去,无论是悔恨还是不甘,都是在用今天的时间为昨天的成本付费。真正的翻篇,不是遗忘,而是接受,是停止用今天的宝贵能量去浇灌昨天的枯枝。你的时间、精力和心情,才是最值得投资的资产。


一、引言:为什么数据传输加密是应用的生死线

在万物互联时代,数据在传输过程中面临的威胁远比存储时更复杂。公共 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 被攻破,双向 TLS(mTLS)实现双向身份认证;
  • 网络通信层@ohos.net.http模块处理 HTTP/HTTPS 请求,DSoftBus 处理跨设备分布式通信,WebSocket 处理实时推送;
  • 安全基础设施层:系统预置根证书库完成证书链校验,TEE 可信执行环境保护密钥协商过程。

这一架构的核心优势在于分层解耦——开发者无需关心底层加密细节,只需在正确的层级配置正确的安全策略。


三、HTTPS/TLS 安全传输实战

3.1 TLS 1.3 握手流程

TLS 1.3 相比 TLS 1.2 有三大革命性改进:

  1. 1-RTT 握手:仅需一次往返即可完成握手(TLS 1.2 需要 2-RTT),延迟降低 50%;
  2. 前向安全:支持 0-RTT 会话恢复,同时保证前向安全性——即使长期私钥泄露,历史会话也无法解密;
  3. 废弃不安全算法:彻底移除 RSA 密钥交换、MD5/SHA-1 签名、CBC 模式等存在已知漏洞的算法,仅保留 ECDHE + AEAD(AES-GCM / ChaCha20-Poly1305)。

3.2 基础 HTTPS 请求

HarmonyOS 通过@ohos.net.http模块提供 HTTPS 支持,默认启用证书校验:

importhttpfrom'@ohos.net.http';import{BusinessError}from'@kit.BasicServicesKit';/** * 安全的 HTTPS GET 请求 */asyncfunctionsecureGet(url:string):Promise<string>{consthttpRequest=http.createHttp();try{constresponse=awaithttpRequest.request(url,{method:http.RequestMethod.GET,header:{'Content-Type':'application/json','Accept':'application/json'},// 默认 sslVerify = true,必须保持开启// 生产环境绝对不要设置为 false!});if(response.responseCode===200){returnresponse.resultasstring;}else{thrownewError(`HTTP${response.responseCode}`);}}catch(error){conste=errorasBusinessError;// 证书校验失败会抛出特定错误码if(e.code===2300001||e.message?.includes('certificate')){console.error('证书校验失败:可能遭受中间人攻击!');}throwerror;}finally{httpRequest.destroy();}}

致命陷阱:某些开发者在调试时为了绕过自签名证书问题,会设置sslVerify: false。这在生产环境中是绝对禁止的——一旦用户连接到攻击者控制的 Wi-Fi,所有 HTTPS 流量将被明文劫持。

3.3 TLS 版本与加密套件配置

HarmonyOS 支持细粒度的 TLS 安全配置,开发者应强制使用 TLS 1.2 及以上版本:

importhttpfrom'@ohos.net.http';/** * 创建高安全级别的 HTTP 请求 */functioncreateSecureHttpRequest():http.HttpRequest{consthttpRequest=http.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 Pinning)

4.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="}]}}]}}

在代码中动态校验证书指纹:

importhttpfrom'@ohos.net.http';// 预置的证书公钥 SHA-256 哈希(Base64)constTRUSTED_PINS:Map<string,string[]>=newMap([['api.example.com',['sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=','sha256/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=']],['cdn.example.com',['sha256/CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC=']]]);/** * 带证书固定的 HTTPS 请求 */asyncfunctionpinnedRequest(url:string):Promise<http.HttpResponse>{consthttpRequest=http.createHttp();// 注册证书校验回调httpRequest.on('headerReceive',(err,data)=>{if(err){console.error('Header receive error:',err);return;}// 获取证书指纹constcertFingerprint=data.getCertificateFingerprint?.();consthostname=newURL(url).hostname;constexpectedPins=TRUSTED_PINS.get(hostname);if(expectedPins&&certFingerprint){constisValid=expectedPins.some(pin=>certFingerprint.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字段强制开发者定期更新固定配置,防止使用过期证书;
  • 备用降级策略:证书固定校验失败时,可降级到标准证书链校验(需记录安全日志)。

五、双向 TLS(mTLS)

5.1 双向 TLS 原理

标准 HTTPS 中,只有客户端校验服务器身份(单向认证)。在双向 TLS 中,服务端也会校验客户端证书,确保只有持有合法客户端证书的设备才能访问 API。

mTLS 的典型应用场景:

  • IoT 设备接入:防止未授权设备冒充合法设备接入云端;
  • 企业内网 API:确保只有公司配发的设备能访问内部服务;
  • 微服务间通信:服务网格(Service Mesh)中服务间的双向认证。

5.2 HarmonyOS 实现双向 TLS

importhttpfrom'@ohos.net.http';/** * 配置双向 TLS 的 HTTP 请求 */asyncfunctionmtlsRequest(url:string):Promise<http.HttpResponse>{consthttpRequest=http.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 实现"超级终端"的核心组件,其安全传输流程包含六个阶段:

  1. 设备发现:通过 CoAP 广播或 BLE 广播发现周边设备,交换设备基本信息;
  2. 设备认证:基于证书的双向认证 + ECDHE 密钥协商,确保通信双方身份可信;
  3. 组网建立:LNN(Local Network Node)分配 networkId,设备加入分布式账本;
  4. 通道协商:通过 UDP 协商 QoS 参数,根据业务需求选择 TCP/UDP/流通道;
  5. 数据加密传输:使用 AES-GCM 对数据进行端到端加密,密钥由 TEE 保护;
  6. 会话关闭:业务主动调用Shutdown释放资源,清理会话密钥。

6.2 DSoftBus 安全传输代码示例

import{distributedDeviceManager}from'@kit.DistributedServiceKit';import{socket}from'@kit.DistributedServiceKit';/** * 建立安全的 DSoftBus 连接 */asyncfunctionestablishSecureConnection(targetNetworkId:string):Promise<number>{// 1. 创建 SocketconstclientSocket=socket.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 已自动解密)constdecoder=newTextDecoder();console.info(`收到数据:${decoder.decode(data)}`);},onError:(socketId:number,errCode:number)=>{console.error(`通道错误: socketId=${socketId}, err=${errCode}`);}};// 4. 绑定(建立安全连接)// DSoftBus 会自动完成:设备认证 -> 密钥协商 -> 加密通道建立constresult=awaitsocket.bind(clientSocket,targetNetworkId,qos,listener);if(result!==0){thrownewError(`DSoftBus 连接失败:${result}`);}returnclientSocket;}/** * 发送加密数据 */asyncfunctionsendSecureData(socketId:number,data:string):Promise<void>{constencoder=newTextEncoder();constbuffer=encoder.encode(data);// DSoftBus 会自动对数据进行 AES-GCM 加密后传输constresult=awaitsocket.sendBytes(socketId,buffer);if(result!==0){thrownewError(`发送失败:${result}`);}console.info('加密数据已发送');}/** * 关闭安全连接 */asyncfunctioncloseSecureConnection(socketId:number):Promise<void>{socket.shutdown(socketId);console.info('安全通道已关闭,会话密钥已清理');}

DSoftBus 安全的核心保障

  • 设备绑定认证:组网前必须完成设备绑定(通过华为账号或扫码配对),未绑定设备无法通信;
  • 端到端加密:数据在发送端加密、接收端解密,中间节点(包括路由器)无法读取明文;
  • 密钥不出 TEE:会话密钥在 TEE 中协商和存储,应用层无法导出;
  • 多链路自适应:根据网络环境自动在 Wi-Fi、蓝牙、NFC 间切换,始终保持加密通道。

七、WebSocket 安全传输

对于实时通信场景(如 IM、股票行情、游戏同步),WebSocket 是比 HTTP 轮询更高效的选择。HarmonyOS 通过wss://(WebSocket over TLS)确保传输安全:

import{webSocket}from'@kit.NetworkKit';/** * 建立安全的 WebSocket 连接 */functioncreateSecureWebSocket(url:string):webSocket.WebSocket{// 必须使用 wss:// 而非 ws://if(!url.startsWith('wss://')){thrownewError('WebSocket 必须使用 wss:// 协议');}constws=webSocket.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加密跨设备分布式端到端设备认证+加密
WebSocket+TLS实时推送/IMwss协议TLS over WS
端到端加密(E2EE)隐私聊天/文件应用级服务端无法解密

九、踩坑记录与常见问题

坑1:混合内容(Mixed Content)

在 HTTPS 页面中请求 HTTP 资源会被系统阻止。确保所有资源(图片、API、WebSocket)统一使用 HTTPS。

坑2:证书固定过于严格

只固定一个证书公钥,当服务器更换证书时,所有客户端立即无法连接。务必预留至少一个备用公钥

坑3:忽略证书过期

未处理证书过期场景,导致应用在某一天突然全部无法联网。建议实现证书过期预警机制

坑4:DSoftBus 未绑定设备

DSoftBus 通信前必须先完成设备绑定(通过华为账号或扫码)。未绑定设备调用bind会返回认证失败

坑5:TLS 1.3 兼容性问题

部分老旧服务端可能不支持 TLS 1.3。建议配置minTlsVersion: TLS_V1_2,同时优先尝试 TLS 1.3。

坑6:WebSocket 心跳缺失

长连接无心跳保活,被运营商/NAT 断开。建议设置 30~60 秒心跳间隔


十、总结

HarmonyOS 为数据传输安全提供了从云端到端侧、从单设备到分布式的完整解决方案:

  • 通用 API 通信:使用 HTTPS + TLS 1.3,强制证书校验,禁用明文传输;
  • 高安全场景:叠加证书固定(SSL Pinning),将信任锚点从 CA 转移到应用自身;
  • IoT/企业场景:使用双向 TLS(mTLS),服务端也校验客户端身份;
  • 跨设备场景:使用 DSoftBus,享受自动设备认证 + 端到端加密 + 多链路自适应;
  • 实时通信:使用 wss:// 协议,配合心跳保活和消息签名。

数据传输安全的核心原则可以总结为一句话:加密传输、校验身份、不信任任何中间节点。在 HarmonyOS 的安全架构支持下,开发者只需在正确的位置配置正确的策略,就能构建出经得起安全审计的应用。


转载自:https://blog.csdn.net/u014727709/article/details/163782657
欢迎 👍点赞✍评论⭐收藏,欢迎指正

← 返回列表