17个版本 (稳定)
2.3.1 | 2024年1月22日 |
---|---|
2.2.0 | 2022年1月31日 |
2.1.0 | 2021年3月30日 |
1.3.0 | 2021年2月3日 |
0.1.3 | 2019年3月12日 |
#50 在 加密学 中
每月下载量3,632
用于 4 个 软件包(2个直接使用)
94KB
1.5K SLoC
rust-ece −
此软件包尚未进行安全审查,使用风险自负(跟踪问题).
ece 软件包是Web推送(RFC8291)的消息加密和基于其实现的HTTP加密内容编码方案的Rust实现。
它提供低级别的加密“管道”,旨在供更高层次的Web推送库使用,包括服务器端和客户端。它是ecec C库的移植。
实现方案
此软件包实现了已发布的Web推送加密方案和早期草案中的旧方案,后者仍在野外广泛使用。
aes128gcm
:在RFC8291和RFC8188中描述的方案aesgcm
:在draft-ietf-webpush-encryption-04和draft-ietf-httpbis-encryption-encoding-03中描述的草案方案
它不支持,并且我们也没有计划支持来自早期草案的过时的aesgcm128方案。
使用方法
要通过Web推送接收消息,接收者必须生成一个EC密钥对和一个对称认证密钥,然后将公钥和认证密钥分发给发送者
let (keypair, auth_secret) = ece::generate_keypair_and_auth_secret()?;
let pubkey = keypair.pub_as_raw();
// Base64-encode the `pubkey` and `auth_secret` bytes and distribute them to the sender.
发送者可以使用接收者的公钥对Web推送消息进行加密
let ciphertext = ece::encrypt(&pubkey, &auth_secret, b"payload")?;
接收者可以使用他们的私钥解密它
let plaintext = ece::decrypt(&keypair, &auth_secret, &ciphertext)?;
这就是全部的内容!高级库负责管理加密负载的分配,通常是通过在HTTP响应头中包含Content-Encoding: aes128gcm
来实现的。
旧版aesgcm
加密
旧版aesgcm
方案更复杂,因为它在HTTP头字段中而不是加密负载部分中通信一些加密参数。当用于加密时,发送者必须处理除密文外的Encryption
和Crypto-Key
头
let encrypted_block = ece::legacy::encrypt_aesgcm(pubkey, auth_secret, b"payload")?;
for (header, &value) in encrypted_block.headers().iter() {
// Set header to corresponding value
}
// Send encrypted_block.body() as the body
接收aesgcm
消息时,接收者需要从Encryption
和Crypto-Key
字段中解析加密参数
// Parse `rs`, `salt` and `dh` from the `Encryption` and `Crypto-Key` headers.
// You'll need to consult the spec for how to do this; we might add some helpers one day.
let encrypted_block = ece::AesGcmEncryptedBlock::new(dh, rs, salt, ciphertext);
let plaintext = ece::legacy::decrypt_aesgcm(keypair, auth_secret, encrypted_block)?;
未实现的功能
- 我们不实现流加密或解密,尽管ECE方案设计允许它。
- 我们只支持在多个记录之间对
aes128gcm
进行加密或解密;使用旧版aesgcm
方案的消息必须适合单个记录。 - 我们不支持在加密期间自定义记录大小参数,但在解密期间进行检查。
- 默认记录大小为4096字节。
- 我们不支持在加密期间自定义添加的填充字节数。
- 我们目前为每次加密随机选择填充长度,但这是一个实现细节,不应依赖。
如果需要,这些限制可能会在未来取消。
加密后端
这个crate旨在使用可插拔的后端实现低级加密原语。目前只支持openssl。
发布流程
我们使用cargo-release
来管理发布。要创建新版本,请确保已安装它,然后
- 为发布创建一个新分支
gitcheckout -brelease-vX.Y.Z
gitpush -uorigin release-vX.Y.Z
- 运行
cargo release --dry-run -vv [major|minor|patch]
并检查它建议执行的操作是否合理。 - 运行
cargo release [major|minor|patch]
以准备、提交、标记和发布版本。 - 从您的
release-vX.Y.Z
分支创建一个PR以请求将其合并到主分支。
依赖关系
~0.6–1.7MB
~36K SLoC