Appearance
安全通信
鸿蒙安全通信: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+"。