#gpg #signatures #verifying #io #verify #keyring #gpgv

gpgrv

gpgv的纯Rust实现,用于验证gpg签名

9个版本

0.4.1 2024年3月16日
0.4.0 2022年10月26日
0.3.0 2020年8月19日
0.2.3 2020年2月22日
0.1.0 2018年7月29日

#177 in 加密学

Download history 4/week @ 2024-06-10 169/week @ 2024-07-22

169 每月下载量
用于 2 crates

MIT/Apache

445KB
1.5K SLoC

gpgrv

An RV.

gpgrv 是一个用于验证某些类型GPG签名的Rust库。

use std::io::{stdin, stdout, BufReader, Cursor, Seek, SeekFrom};
fn main() {
    // load a keyring from some file(s)
    // for example, we use the linux distribution keyring
    let mut keyring = gpgrv::Keyring::new();
    let keyring_file = Cursor::new(distro_keyring::supported_keys());
    keyring.append_keys_from(keyring_file).unwrap();

    // read stdin, verify, and write the output to a temporary file
    let mut temp = tempfile::tempfile().unwrap();
    gpgrv::verify_message(BufReader::new(stdin()), &mut temp, &keyring).expect("verification");

    // if we succeeded, print the temporary file to stdout
    temp.seek(SeekFrom::Start(0)).unwrap();
    std::io::copy(&mut temp, &mut stdout()).unwrap();
}

警告

此库不关心相对于系统时间的过期。

如果您想处理过期,您必须自己处理。

是的,这对加密代码来说是一个非常危险的决定。

此代码的预期用途,与实际计算机生成的GPG签名一起工作,是在安全领域的非寻常领域,许多用户不会关心过期,或者会对验证替代时钟或时间窗口感兴趣。

作者不想促进或鼓励这种行为,但尊重许多用户,包括作者要集成的系统,所做的决定。

支持

  • 验证签名
    • RSA
    • SHA1SHA2 (SHA-256, SHA-512).
  • 签名“内联”消息和分离的签名。
  • 加密和解密/二进制。
  • 压缩包装器(由gpg为大多数消息添加)
  • 加载旧式密钥环(即不是keybox文件)

优点

  • 完全是安全的Rust,没有本地代码。易于构建和可移植。
  • MIT(或Apache2,或任何!)授权,不是LGPL。
  • 简单的Rust风格API,基于流(Read/Write)。

缺点

  • 一小部分定制的、低风险的加密代码。然而,任何加密代码都可能出错。
  • 支持有限,但正在增长的关键和数据格式。
  • (故意)不是恒定时间:不能用于某些加密应用。这对于使用公钥的签名验证来说不太重要。

替代方案

  • gpgme (LGPL) - 本地代码的绑定,API详细
  • rpgp (MIT/Apache2) - 许多 pgp 的严肃实现
  • sequoia-openpgp (GPLv3) - 许多 pgp 的严肃实现

我之前使用的是 gpgme API,虽然它可行,但API使用起来很痛苦,链接/要求很复杂。

sequoia 的许可证有误。

rpgp 有很多功能,尽管它似乎已经被很好地分割成crate。

最低支持的Rust版本 (MSRV)

这个crate目前没有测试MSRV,因为 clap(仅在示例中使用)没有MSRV。如果有任何使用案例,请提出一个问题,我会看看 clap 是否已经改进,或者是否有方便的方式来CI旧版本,而不使用 clap

MSRV的升级是一些类型的semver升级,需要决定 1.0.0

许可证

根据您的要求,许可方式可以是以下之一

  • Apache License,版本2.0
  • MIT许可证

任选其一。

贡献

除非您明确说明,否则您提交给工作内容的任何贡献,根据Apache-2.0许可证定义,将按上述方式双重许可,不附加任何额外条款或条件。

依赖

约4MB
约66K SLoC