· 3 min read
微信 xlog 加密原理分析:TEA + ECDH 密钥协商
Android
微信的日志组件 xlog 如何保证用户隐私?本文解析 TEA 加密算法与 ECDH 密钥交换在其中的应用。
微信 Mars 与 xlog 简介
Mars 是微信团队开发的一套跨平台基础设施组件,主要包含四大模块:
| 模块 | 作用 |
|---|---|
| comm | 通用基础库 |
| Xlog | 高性能日志组件 |
| SDT | 网络检测组件 |
| STN | 信令网络组件 |
xlog 专为移动端设计,具有高性能、高可用、安全性、容错性等特点。更重要的是,xlog 支持加密传输,确保日志内容不会在传输过程中被窃取或篡改。
xlog 加密的核心价值
在移动端日志收集场景中,加密尤为重要:
- 用户设备可能处于不安全的网络环境
- 日志可能包含敏感业务信息
- 防止日志被恶意分析或篡改
TEA 加密算法详解
TEA(Tiny Encryption Algorithm)是一种轻量级对称加密算法,由英国密码学家 Roger Needham 和 David Wheeler 设计。其特点是代码体积小、运算速度快,非常适合资源受限的移动端环境。
算法原理
TEA 采用 Feistel 结构,使用 64 位数据块和 128 位密钥,经过 64 轮迭代实现加密。核心加密函数如下:
// TEA 加密函数简化版
void tea_encrypt(uint32_t* v, uint32_t* k) {
uint32_t v0 = v[0], v1 = v[1];
uint32_t sum = 0;
uint32_t delta = 0x9e3779b9;
for (int i = 0; i < 32; i++) {
v0 += ((v1 << 4) ^ (v1 >> 5)) + v1 ^ (sum + k[sum & 3]);
sum += delta;
v1 += ((v0 << 4) ^ (v0 >> 5)) + v0 ^ (sum + k[(sum >> 11) & 3]);
}
v[0] = v0;
v[1] = v1;
}
TEA 的特点
- 轻量级:核心加密代码仅几十行
- 高效:加解密速度极快,适合高频日志场景
- 可逆:解密是加密的逆过程
- 安全性:虽然设计于1997年,但经过适当配置(如多次迭代)仍具安全性
xlog 中的 TEA 应用
在 xlog 中,TEA 算法被用于实际的数据加密:
// xlog 中的加密调用(伪代码)
void __TeaEncrypt(char* logData, int len, char* key) {
// 将日志数据按 8 字节(64 位)分块
// 对每块使用 TEA 算法加密
// ...
}
xlog 使用 16 Bytes(128 位)密钥,与 TEA 的 128 位密钥长度完美匹配。
ECDH 密钥交换详解
虽然 TEA 加密很强,但密钥分发是核心问题。总不能把密钥硬编码在 App 中吧?
ECDH(Elliptic Curve Diffie-Hellman)完美解决了这个问题——双方可以在不传输密钥的情况下,协商出同一个对称密钥!
ECDH 工作流程
sequenceDiagram
participant Client as 客户端 (App)
participant Server as 服务器端
Note over Client: 生成 ECC 公私钥对<br/>pubKeyA, priKeyA
Client->>Server: 发送 pubKeyA
Note over Server: 生成 ECC 公私钥对<br/>pubKeyB, priKeyB
Server-->>Client: 发送 pubKeyB
Note over Client: 使用 pubKeyB + priKeyA<br/>计算共享密钥 secret
Note over Server: 使用 pubKeyA + priKeyB<br/>计算共享密钥 secret
Note over Client,Server: 双方得到相同的 secret!
xlog 的密钥协商流程
xlog 采用了预置公钥 + 动态私钥的方案:
- 服务端:预置服务器端的 ECC 公私钥对(private key 严格保密)
- 客户端:每次启动时动态生成客户端的 ECC 公私钥对
- 密钥派生:客户端使用服务端公钥 + 客户端私钥 → 得到会话密钥
- 加密传输:使用会话密钥通过 TEA 加密日志
// xlog 密钥协商简化流程
void key_negotiation() {
// 1. 生成客户端公私钥
uECC_make_key(client_pubkey, client_pri);
// 2. 使用服务端公钥计算共享密钥
uECC_shared_secret(server_pubkey, client_pri, session_key);
// 3. session_key 即为 TEA 加密用的对称密钥
}
安全性分析
| 环节 | 安全性 |
|---|---|
| 公钥传输 | 安全(公钥本来就是公开的) |
| 私钥保护 | 客户端私钥内存生成,服务端私钥离线保管 |
| 密钥协商 | 第三方无法从公钥推导出私钥(椭圆曲线离散对数难题) |
| 密钥存储 | 对称密钥存于栈区,不持久化,进程结束即销毁 |
实际使用配置
生成密钥对
在 mars/log/crypt 目录下执行:
python gen_key.py
这将生成:
public.key- 公钥,嵌入 Appprivate.key- 私钥,服务端妥善保管
App 集成
// 初始化 xlog 并启用加密
appender_open(
kAppenderAsync, // 异步模式
logPath, // 日志路径
"your_public_key_here", // 公钥
0, //缓存大小
kryptonDebug, // 加密模式
0 // 加密标志
);
⚠️ 微信官方建议:线上版本使用异步日志模式,同步日志不考虑加密效率问题。
总结
xlog 的加密方案体现了简洁高效的设计理念:
| 层级 | 技术 | 优势 |
|---|---|---|
| 密钥交换 | ECDH | 无需预共享密钥,安全协商 |
| 对称加密 | TEA | 轻量级,高性能,适合移动端 |
| 密钥存储 | 栈区内存 | 进程结束后自动销毁,无持久化风险 |
| 模式选择 | 异步优先 | 平衡性能与安全性 |
这种 ECDH + TEA 的组合,既保证了密钥分发的安全性,又兼顾了移动端的性能需求,堪称轻量级加密的经典实践。