Back to Blog
· 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 采用了预置公钥 + 动态私钥的方案:

  1. 服务端:预置服务器端的 ECC 公私钥对(private key 严格保密)
  2. 客户端:每次启动时动态生成客户端的 ECC 公私钥对
  3. 密钥派生:客户端使用服务端公钥 + 客户端私钥 → 得到会话密钥
  4. 加密传输:使用会话密钥通过 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 - 公钥,嵌入 App
  • private.key - 私钥,服务端妥善保管

App 集成

// 初始化 xlog 并启用加密
appender_open(
    kAppenderAsync,                    // 异步模式
    logPath,                           // 日志路径
    "your_public_key_here",            // 公钥
    0,                                 //缓存大小
    kryptonDebug,                      // 加密模式
    0                                  // 加密标志
);

⚠️ 微信官方建议:线上版本使用异步日志模式,同步日志不考虑加密效率问题。

总结

xlog 的加密方案体现了简洁高效的设计理念:

层级技术优势
密钥交换ECDH无需预共享密钥,安全协商
对称加密TEA轻量级,高性能,适合移动端
密钥存储栈区内存进程结束后自动销毁,无持久化风险
模式选择异步优先平衡性能与安全性

这种 ECDH + TEA 的组合,既保证了密钥分发的安全性,又兼顾了移动端的性能需求,堪称轻量级加密的经典实践。


相关阅读