9 个版本 (4 个重大更改)
0.5.1 | 2024年7月20日 |
---|---|
0.5.0 | 2024年7月20日 |
0.4.0 | 2024年4月25日 |
0.3.0 | 2024年4月10日 |
0.1.1 | 2023年12月18日 |
#336 in 密码学
每月588次下载
用于 hiqlite
155KB
3.5K SLoC
cryptr - 简单加密(流式)值
cryptr 的理念是提供一个简单且健壮的方法来加密各种类型的值。
早期版本
cryptr 处于非常早期的阶段。在发布第一个开源版本之前,我已经正确地设置了基础层,但即使如此,第一版早期版本中可能会有所变化,尽管我不期望有任何重大变化。
我有一些关于未来功能的想法,比如能够从 CLI 启动服务器,这样你就可以在任何地方托管自己的小型存储,而不必担心暴露值,因为所有内容在本地加密之前就已经加密了。
我已经设置了许多测试用例,并且到目前为止一切看起来都非常良好且稳定。
预包装版本将在未来推出。
原因
已经有许多加密工具了,而 cryptr 的主要目的不是文件加密,尽管它处理得非常完美且非常快。
cryptr 诞生的主要原因是我需要在不同的项目中加密小的值,因为我不想在数据库或其他地方以明文形式保存它们。对于密码,你有散列,但当你在应用程序中某个时候需要读取该值时,这不是一个选项,例如 Webauthn 用户数据。
我为此用例有两个非常简单的小函数,我把它们复制粘贴到各个地方。这变得越来越麻烦,而且当我对它们进行改进时,更是如此。
另一个问题是,这些函数根本不考虑未来兼容性。每次我对函数进行更改时,我都需要手动处理所有加密值迁移,这真的很烦人。
它能做什么
直接加密小值
我创建了cryptr,以快速、高效和稳健的方式处理所有这些事情。例如,它可以处理你想为特殊数据库列加密的小数值,而不需要太多的开销或设置。你不需要跟踪与值一起使用的加密密钥,因为你应该始终能够进行密钥轮换等操作。
一个非常小的头,通常小于40字节(取决于你是否选择自定义、长密钥ID)将被添加到值中,其中包含所有必要的信息。在我所有的项目中,我都有这些信息在不同的列中,每次都需要手动处理所有这些。现在不再是这样了。
流式传输
cryptr还可以在飞快地进行流式加密,同时内存使用量非常少。例如,我将其用于将数据库备份的流式复制到外部存储。它基本上可以处理任何大小的文件,逐块读取它们,使用 ChaCha20Poly1305 在线加密,然后将块直接流式传输到外部的 S3 对象存储。
性能根本不受此影响。负载和任务在内部分散到多个核心上,并在任务之间使用4个小缓冲区。在我的第一次测试中,内存开销非常小,我能够在整个操作过程中仅使用几MB的内存来流式传输任何大小的文件。
由于加密发生在本地,因此你可以轻松地在可能不信任存储管理员或可以访问它的人的环境中使用它。
抗篡改
cryptr 使用 AEAD 流式加密算法(目前只有 ChaCha20Poly1305)。这意味着整个加密有效负载和每个流式传输的块都会附加 MAC。这意味着即使有人篡改了你的数据,最坏的情况是加密无法工作,或者实际上会抱怨有效负载已损坏。数据不仅被加密,同时也会验证,以确保它仍然是原始值。
CLI和库
cryptr 可以作为 CLI 工具提供,或者它可以作为常规 crate 用于任何项目。
CLI 已经可以处理大多数情况,并且甚至提供了一个很好的 UX,通过 CLI 导入和设置值,而不是手动更新配置文件。您可以通过 CLI 执行内存操作以及流式操作,甚至可以流式传输到 S3 存储。
安装CLI
目前,您可以通过 cargo
安装 CLI
cargo install cryptr --features cli
示例
您可以在 示例 文件夹中找到库和 CLI 的使用示例。
依赖关系
~10–29MB
~429K SLoC