架构设计

代码结构

├── android
│   ├── app # android demo app
│   └── lib-ezlog # ezlog android library
├── examples # Rust examples
├── ezlog_flutter # Flutter plugin
├── ezlogcli # Rust command line tool
├── ezlog-core # Rust core library
├── ios
│   ├── EZLog # ezlog iOS library
│   ├── demo # iOS demo app
│   └── framework # ezlog XCFramework

日志文件格式

文件头

字节范围内容
0-1固定字符
2版本号
3Flag位
4-7日志的当前下标
8-15Unix时间戳(大端)
16压缩算法
17加密算法
18-21密钥哈希

单条日志格式

字节范围字段名称描述
0开始标记固定字符0x3b标记开始
1-可变下标日志长度描述日志内容长度的字节数
可变下标+1-可变下标+日志长度日志内容日志内容
可变下标+日志长度+1结束标记固定字符0x21表示结束

压缩算法

我们使用zlib作为默认压缩算法

加密算法

我们使用AES-GCM-SIV作为默认加密算法

AES-GCM-SIV 是一种对称加密算法,与非对称加密相比更高效。作为一种 AEAD 算法,与 AES-CFB 相比,它更安全;与 AES-GCM 相比,AES-GCM-SIV 具有抗重复口令攻击的特点。

确保 nonce 不重复

首先,我们需要一个初始nonce,在创建记录器时随机生成。然后,我们获取日志文件创建时的时间戳。当我们写入日志记录时,我们知道当前日志文件的索引,并且我们可以使用以下公式计算当前日志记录的nonce:

nonce = init_nonce ^ timestamp.extend(index)