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加密学

Download history 744/week @ 2024-03-14 764/week @ 2024-03-21 639/week @ 2024-03-28 962/week @ 2024-04-04 689/week @ 2024-04-11 762/week @ 2024-04-18 957/week @ 2024-04-25 927/week @ 2024-05-02 1068/week @ 2024-05-09 1284/week @ 2024-05-16 1015/week @ 2024-05-23 1443/week @ 2024-05-30 1171/week @ 2024-06-06 630/week @ 2024-06-13 789/week @ 2024-06-20 768/week @ 2024-06-27

每月下载量3,632
用于 4 软件包(2个直接使用

MPL-2.0 许可证

94KB
1.5K SLoC

rust-ece − 构建状态 最新版本

此软件包尚未进行安全审查,使用风险自负(跟踪问题.

ece 软件包是Web推送(RFC8291)的消息加密和基于其实现的HTTP加密内容编码方案的Rust实现。

它提供低级别的加密“管道”,旨在供更高层次的Web推送库使用,包括服务器端和客户端。它是ecec C库的移植。

完整文档

实现方案

此软件包实现了已发布的Web推送加密方案和早期草案中的旧方案,后者仍在野外广泛使用。

它不支持,并且我们也没有计划支持来自早期草案的过时的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头字段中而不是加密负载部分中通信一些加密参数。当用于加密时,发送者必须处理除密文外的EncryptionCrypto-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消息时,接收者需要从EncryptionCrypto-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来管理发布。要创建新版本,请确保已安装它,然后

  1. 为发布创建一个新分支
    • gitcheckout -brelease-vX.Y.Z
    • gitpush -uorigin release-vX.Y.Z
  2. 运行cargo release --dry-run -vv [major|minor|patch]并检查它建议执行的操作是否合理。
  3. 运行cargo release [major|minor|patch]以准备、提交、标记和发布版本。
  4. 从您的release-vX.Y.Z分支创建一个PR以请求将其合并到主分支。

依赖关系

~0.6–1.7MB
~36K SLoC