Skip to content

安全通信

鸿蒙安全通信:HTTPS/TLS、证书绑定、数据加密传输。


1. HTTPS 通信

1.1 基础 HTTPS

typescript
import { http } from '@kit.NetworkKit'

let httpClient = http.createHttp()

// HTTPS 请求(自动 TLS 加密)
httpClient.request('https://api.example.com/data', {
    method: http.HttpRequestMethod.GET,
    header: {
        'Content-Type': 'application/json'
    }
}).then((response: http.HttpResponse) => {
    console.log('状态码:', response.statusCode)
    console.log('数据:', response.result)
}).catch((err: http.HttpError) => {
    console.error('请求失败:', err.message)
}).finally(() => {
    httpClient.destroy()
})

2. SSL Pinning(证书绑定)

2.1 实现 SSL Pinning

typescript
import { http, ssl } from '@kit.NetworkKit'
import fs from '@ohos.file.fs'

// 加载服务器证书(PEM 格式)
let certificate = fs.readSync('rawfile://server.pem')

// 创建 SSL 上下文
let sslContext = ssl.createSSLContext({
    caCertificates: [certificate],  // 信任的证书
    serverCertPin: true,            // 启用证书绑定
    verifyHostname: true,           // 验证主机名
    minVersion: ssl.TLSVersion.TLS1_2  // 最低 TLS 1.2
})

// 创建 HTTPS 客户端
let httpClient = http.createHttp({
    sslContext: sslContext
})

// 请求(自动验证证书)
httpClient.request('https://api.example.com/data', {
    method: http.HttpRequestMethod.GET
}).then((response) => {
    console.log('安全请求成功')
}).catch((err) => {
    if (err.code === 4001) {
        console.error('证书验证失败!可能是 MITM 攻击')
    } else {
        console.error('请求失败:', err.message)
    }
}).finally(() => {
    httpClient.destroy()
})

3. 数据加密传输

3.1 请求体加密

typescript
import { crypto } from '@kit.CryptoArchitectureKit'

// 加密请求数据
async function sendEncryptedData(url: string, data: any): Promise<void> {
    // 生成会话密钥
    let sessionKey = crypto.generateKey({
        algorithm: crypto.Algorithm.AES_256_GCM,
        keySize: 256
    })

    // 加密数据
    let encrypted = crypto.encrypt({
        key: sessionKey,
        data: new TextEncoder().encode(JSON.stringify(data)),
        algorithm: crypto.Algorithm.AES_256_GCM
    })

    // 发送加密数据
    let httpClient = http.createHttp()
    await httpClient.request(url, {
        method: http.HttpRequestMethod.POST,
        header: {
            'Content-Type': 'application/octet-stream',
            'X-Session-Key': await exportPublicKey(sessionKey)
        },
        extraData: encrypted
    })
    httpClient.destroy()
}

3.2 响应解密

typescript
// 解密响应数据
async function receiveEncryptedData(url: string): Promise<any> {
    let httpClient = http.createHttp()
    let response = await httpClient.request(url, {
        method: http.HttpRequestMethod.GET
    })
    httpClient.destroy()

    // 解密响应
    let decrypted = crypto.decrypt({
        key: sessionKey,
        data: response.result as ArrayBuffer,
        algorithm: crypto.Algorithm.AES_256_GCM
    })

    return JSON.parse(new TextDecoder().decode(decrypted))
}

4. 安全最佳实践

✅ 推荐:
├─ 所有 API 使用 HTTPS
├─ 启用 SSL Pinning(防止 MITM)
├─ 敏感数据加密传输
├─ 验证服务器证书
├─ 使用 TLS 1.2+
└─ 定期更新证书

❌ 避免:
├─ HTTP 明文传输
├─ 禁用证书验证
├─ 自签名证书不验证
├─ 敏感数据明文传输
└─ 使用过时的 TLS 版本

5. 面试高频考点

Q1: 如何防止 MITM 攻击?

回答:启用 SSL Pinning(证书绑定),只信任指定证书,即使攻击者伪造 CA 证书也无法通过验证。

Q2: 敏感数据如何传输?

回答:HTTPS + 应用层加密(AES),双重保护。


🐱 小猫提示:安全通信记住 "HTTPS、SSL Pinning 防 MITM、敏感数据加密、TLS 1.2+"