架构设计
代码结构
├── 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 | 版本号 |
3 | Flag位 |
4-7 | 日志的当前下标 |
8-15 | Unix时间戳(大端) |
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)