2 个版本
0.1.1 | 2022年1月18日 |
---|---|
0.1.0 | 2021年10月31日 |
#1126 在 密码学
52KB
769 代码行
OmegaUpload
OmegaUpload 是一种零知识临时文件托管服务。
示例
# Uploading a file:
$ omegaupload upload https://paste.example.com path/to/file
https://paste.example.com/PgRG8Hfrr9rR#I1FG2oejo2gSjB3Ym1mEmRfcN4X8GXc2pZtZeiSsWFo=
# Uploading a file with a password:
$ omegaupload upload -p https://paste.example.com path/to/file
Please set the password for this paste:
https://paste.example.com/862vhXVp3v9R#key:tbGxzHBNnXjS2eq89X9uvZKz_i8bvapLPEp8g0waQrc=!pw
# Downloading a file:
$ omegaupload download https://paste.example.com/PgRG8Hfrr9rR#I1FG2oejo2gSjB3Ym1mEmRfcN4X8GXc2pZtZeiSsWFo=
功能
- 当通过支持的客户端(Direct,明文上传可行但不受支持)上传时,服务器对上传的数据一无所知。
- 服务器上存储的唯一元数据是过期时间。这是一个强有力的保证。
- 所有加密功能都在客户端执行,并通过单个通用库执行,以最大限度地减少编程错误的风险。
- 使用推荐参数使用现代加密功能:XChaCha20Poly1305 用于加密和 Argon2id 用于 KDF。
- 可自定义过期时间,从阅读后销毁到 1 天。
从源代码构建
先决条件
yarn
1.22.17 或更高版本(较早版本未经测试,但可能可行)- Cargo,支持最新版本的 Rust
- (可选) zstd,用于将文件压缩以进行分发
首先,运行 git submodule update --init --recursive
。
然后,运行 ./bin/build.sh
以生成 dist.tar.zst
,您可以简单地提取该文件夹并运行提供的二进制文件。服务器将在端口 8080
上监听。
运行本地服务器
运行 ./bin/build.sh
后,您可以将 cd 进入 dist
并运行 ./omegaupload-server
。它将在端口 8000 上运行,并响应对 HTTP 请求。
然后,您可以将 omegaupload CLI 实例(或运行 cargo run --bin omegaupload
)作为上传服务器。
如果您只是更改前端(而不是更新服务器代码),则可以运行 yarn build
以实现更快的迭代。
为什么选择 OmegaUpload?
OmegaUpload 的主要好处是前端使用一个统一的通用库,该库使用 XChaCha20Poly1305 加密和解密文件。
安全性
主要目标是提供一个统一的库,同时用于命令行工具和Web前端,以最小化被攻击的风险。因此,命令行工具和Web前端都使用了一个Rust库,该库的加密模块公开了两个函数用于加密和解密,这些函数只接受消息和必要的密钥材料,或者只返回必要的密钥材料。这个小的API有效地消除了前后端之间的差异,并确保攻击面仅限于这些函数。
密码KDF
如果在加密时提供了密码,则使用argon2作为密钥派生函数。具体来说,该库符合或超过了OWASP推荐的参数
- 使用Argon2id。
- 算法版本是
0x13
。 - 参数是
m = 15MiB
,t = 2
,p = 2
。
此外,使用16字节的盐大小。
Blob加密
由于XChaCha20Poly1305正成为加密消息的推荐方法,因此使用了它作为加密方法。选择它而不是AES主要是由于其相关的密钥攻击强度,以及其在WireGuard、Quic和TLS中的广泛认可和使用。
由于这个crate使用XChaCha20
,因此使用24字节nonce和32字节密钥。
保密性
公共crate提供的加密和解密函数只接受或返回将在销毁时正确置零的密钥材料。这是通过secrecy
crate实现的,它除了提供零内存的包装类型外,还提供了一种简单的方法来审计何时泄露了秘密。
这也意味着使用这两个函数必然需要调用者首先将密钥材料封装在包装类型中,从而减少密钥材料留在内存中的可能性。
内存安全性
Rust消除了整类与内存相关的错误,并且任何unsafe
块都附有安全注释。这允许轻松审计可疑的内存代码,并允许
为什么不使用OmegaUpload?
不使用OmegaUpload有几个原因
- 限制为3GB的上传——这是RocksDB的软限制。
- 无法通过Web前端下载大于512 MiB的文件——这是当前Web前端的技术限制,因为它没有使用Web worker,并且浏览器没有针对XChaCha20进行优化。
- 前端使用WASM,这是一个新的攻击面。
依赖项
~8–21MB
~323K SLoC