2个不稳定版本
0.2.0 | 2022年1月18日 |
---|---|
0.1.0 | 2021年10月31日 |
#2247 in 密码学
在omegaupload中使用
27KB
556 行
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=
功能
- 当通过支持的客户端(直接,明文上传是可能的但不受支持)上传时,服务器对上传的数据没有任何知识。
- 存储在服务器上的唯一元数据是过期时间。这是一个强有力的保证。
- 所有加密函数都在客户端执行,并通过一个单一的通用库完成,以最大限度地减少编程错误的风险。
- 使用推荐参数使用现代加密函数: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
后,您可以进入dist
并运行./omegaupload-server
。它将在端口8000上运行,并响应HTTP请求。
然后,您可以将omegaupload CLI实例(或运行cargo run --bin omegaupload
)用作上传服务器。
如果您只是更改前端(而不是更新服务器代码),则可以运行yarn build
以实现更快的迭代。
为什么选择OmegaUpload?
OmegaUpload的主要好处是前端使用一个统一的通用库,该库利用XChaCha20Poly1305来加密和解密文件。
安全性
主要目标是提供一个统一的库,既适用于CLI工具,也适用于Web前端,以最小化被入侵的风险。因此,CLI工具和Web前端都使用一个Rust库,该库的加密模块提供了两个函数,用于加密和解密,这些函数只接受消息和必要的密钥材料,或者只返回必要的密钥材料。这个小的API有效地消除了前后端之间的差异,并确保攻击面仅限于这些函数。
密码KDF
如果在加密时提供了密码,则使用argon2作为密钥推导函数。具体来说,该库符合或超过了OWASP推荐参数。
- 使用Argon2id。
- 算法版本是
0x13
。 - 参数是
m = 15MiB
,t = 2
,p = 2
。
此外,还使用了16字节的盐大小。
blob加密
由于XChaCha20Poly1305正成为加密消息的推荐主流方法,因此使用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,这是一个新的攻击面。
lib.rs
:
包含多个项目使用的公共函数和结构。
依赖关系
~4.5–8MB
~172K SLoC