3 个稳定版本
1.1.1 | 2024年5月12日 |
---|---|
1.1.0 | 2024年5月11日 |
1.0.0 | 2024年5月10日 |
在 压缩 中排名第 118
每月下载量 61 次
125KB
2.5K SLoC
Exaf
EXtensible Archiver Format(Exaf)旨在用于压缩和归档文件。它提供了对知名的 zip 和 7-zip 格式的替代方案,并考虑了可扩展性。此参考实现运行时间与 GNU tar 使用 Zstandard 压缩类似,生成的文件大小也非常相似。它运行速度更快,文件大小比 Info-Zip 小得多。尽管文件大小比 7-zip 大,但运行时间要短得多。使用 Argon2id 密钥导出函数和 AEAD 加密算法对元数据和文件内容进行加密,以确保数据机密性和真实性。有关更多信息,请参阅下面的 加密 部分。
规范
有关详细信息,请参阅 FORMAT.md 文件。
简而言之,当使用 Zstandard 压缩时,它类似于 tar,但开销更小,文件集被组合成压缩内容块,而不是压缩整个文件。它从 XAR 和 Exif 中汲取灵感,即在文件开头有一个基本头部,用于标识格式和版本,后面跟着零个或多个类似于 Exif 或 zip 格式的“额外字段”的可选标签/值对。归档内的目录和文件条目完全由标签/大小/值元组组成。
此格式与使用 Zstandard 的 tar 格式不同的地方在于,目录不是压缩的,因此可以快速浏览条目。它不是一次性压缩整个文件,而是将文件内容分组到大的块中,然后再压缩。每个压缩数据集都由相应的目录/文件/链接元数据前缀。因此,此格式类似于 XAR,需要多次出现 TOC 和堆。此格式的优点是,新内容可以简单地附加到现有文件的末尾。
目标
首先,这个项目的目的是满足我自己的需求,并且是用 Rust 编写的,这样我就可以在我的基于Rust的应用程序中使用它。如果它对其他人也有用,那就太好了,我会非常乐意继续朝这个方向开发。
构建和运行
先决条件
- Rust 2021版
运行测试
存在单元测试,用于测试大多数功能。
cargo test
创建、列出、提取归档
首先使用 create
命令创建归档。以下示例假设您已经将一些有趣的内容下载到您的 ~/Downloads
目录中。
$ cargo run -- create archive.exa ~/Downloads/httpd-2.4.59
...
Added 3138 files to archive.exa
现在 archive.exa
文件存在后,您可以使用以下方式列出其内容
$ cargo run -- list archive.exa | head -20
...
httpd-2.4.59/.deps
httpd-2.4.59/.gdbinit
httpd-2.4.59/.gitignore
httpd-2.4.59/ABOUT_APACHE
httpd-2.4.59/Apache-apr2.dsw
httpd-2.4.59/Apache.dsw
httpd-2.4.59/BuildAll.dsp
httpd-2.4.59/BuildBin.dsp
...
最后,运行 extract
将归档内容解压到当前目录
$ cargo run -- extract archive.exa
...
Extracted 3138 files from archive.exa
代码覆盖率
使用 grcov 似乎是此时的最佳选择。
export RUSTFLAGS="-Cinstrument-coverage"
export LLVM_PROFILE_FILE="exaf_rs-%p-%m.profraw"
cargo clean
cargo build
cargo test
grcov . -s . --binary-path ./target/debug/ -t html --branch --ignore-not-existing -o ./target/debug/coverage/
open target/debug/coverage/index.html
加密
使用上述命令中的 --password <PASSWD>
选项,可以使用密码短语对归档进行加密。使用 Argon2id 算法和随机盐(然后存储在归档标题中)生成一个秘密密钥,并使用 AES256-GCM 带有相关数据的认证加密 密文对归档中的每个内容运行进行加密,该密钥和唯一的nonce(存储在每个清单的标题中)一起使用。加密包括条目元数据以及压缩的文件内容。
现有技术
存在许多 归档格式,其中许多已经很久不再常用。那些仍在使用的格式也不是没有缺点,例如加密功能实现不佳,或者容易受到压缩因子利用(例如 zip bomb)。
开始这个项目的原始动机始于 O 宣布了 Pack 文件格式。他们提出了一种新颖的方法来处理归档和压缩文件的问题,同时对这一领域普遍缺乏进展表示遗憾。这个项目的Rust版本可以在 这里 找到——它的速度和输出大小几乎与本项目相同。
依赖项
~7.5MB
~134K SLoC