5个版本

0.100.0 2022年8月2日
0.99.3 2020年7月8日
0.99.2 2020年2月22日
0.99.1 2020年1月28日
0.99.0 2020年1月21日

#3#secret-store

Download history 9/week @ 2024-04-08 44/week @ 2024-04-15 19/week @ 2024-04-22 52/week @ 2024-04-29 31/week @ 2024-05-06 47/week @ 2024-05-13 26/week @ 2024-05-20 28/week @ 2024-05-27 46/week @ 2024-06-03 34/week @ 2024-06-10 38/week @ 2024-06-17 21/week @ 2024-06-24 4/week @ 2024-07-01 80/week @ 2024-07-08 19/week @ 2024-07-15 56/week @ 2024-07-22

每月161次下载
用于 2 crates

Apache-2.0 OR MIT

57KB
732

Rust SecureStore库

crates.io docs.rs

此crate包含对开放SecureStore密钥存储协议的rust实现,可以读取、写入和更新加密密码存储文件,这些文件设计用于存储在您的代码旁边的GIT仓库(或任何其他地方)。

您可以在我们的网站上了解更多关于SecureStore的信息(链接)。用于管理密钥存储(创建新存储、添加、删除和更新密钥)的相关命令行客户端也可以在此仓库中找到(链接)

SecureStore API

使用SecureStore的API主要具有自文档化和保持小的特点。主要接口是通过一个SecretsManager实例,只能通过SecretsManager::new(..)从头开始创建或通过SecretsManager::load(..)从现有的磁盘存储加载。

在常规情况下,SecureStore通过命令行创建和更新,SecureStore API仅在运行时用于检索和解密单个密钥。SecureStore可以通过密码或密钥文件解密,API和命令行界面都提供了创建密码加密存储并导出密钥文件以便在运行时由应用程序使用的方法。

示例用法

以下是一个使用示例,包括对ssclient的简要演示,这是本库的命令行伴侣(也可通过crates.io访问,并可通过cargo安装):

# First, install ssclient, the SecureStore CLI interface
~> cargo install ssclient

# Use ssclient to create a new store with password-based encryption,
# and export the derived keyfile so we can use the SecureStore API
# in a passwordless fashion.
~> ssclient create secrets.json --export-key secrets.key
Password: ***********
Confirm password: ***********

# Add a secret to the store. When -s/--store is not specified,
# defaults to secrets.json
~>  ssclient set foo EXtRAsuPErSECRET
Password: ***********

回到代码的世界,我们现在可以使用此crate中的SecureStore API来与刚刚创建的密钥文件接口,并选择性地使用创建存储时使用的密码或通过导出的包含从密码派生的密钥的密钥文件无密码方式解密其内容。

use securestore::{KeySource, SecretsManager};

fn get_api_key() -> String {
    let sman = SecretsManager::load("secrets.json",
                KeySource::File("secrets.key")).unwrap();
    let api_key = sman.get("foo").unwrap();

    assert_eq!("EXtRAsuPErSECRET", api_key.as_str());
    return api_key;
}

SecureStore API 还包括创建新存储、添加、删除和更新密钥;导出密钥文件以及通常使用 ssclient CLI 伴侣(该伴侣基于此包构建,以实现最大程度的 dogfooding)所做的一切。

加密细节

SecureStore 故意不将其加密内部结构作为其 API 的一部分,所使用的加密算法的具体细节被视为与模式版本硬编码相关。该格式本身被编写为向前兼容,以便如果需要更改底层加密格式,可以以一种对 API 用户透明的 şekilde 进行。

选择加密原语时,必须考虑所选算法在不同语言和平台上的可用性,因为 SecureStore 旨在成为一个开放格式,具有不同语言中的跨兼容实现,并支持许多不同的环境。已经做出了有意识的决策,在可能的情况下减少对第三方依赖的需求。对于当前的 SecureStore 模式(v3),使用 AES-128-CBC 的认证变体,使用两个分别导出/生成的密钥分别用于 AES 加密和 HMAC-SHA1 认证轮次。当与用户提供的密码一起使用时,使用 256,000 轮 SHA1 的 PBKDF2 和一个唯一的种子来生成单独的密钥;密钥拉伸操作的结果 包含在存储中,并且仍然被认为是与密码本身可互换的敏感数据。

目前,所有加密操作(包括 CSPRNG)都使用 OpenSSL,但未来可能被平台本机依赖项所取代。有关更多详细信息,请参阅源代码。

许可和作者

SecureStore 包最初由 NeoSmart Technologies 的 Mahmoud Al-Qudsi 开发,并由 NeoSmart Technologies 和 SecureStore 贡献者积极更新和维护。SecureStore 包在 MIT 和 Apache 2.0 许可下发布。假定对此包的任何贡献都按照相同的许可进行;目前不接受这两种许可之外的贡献。

另请参阅

依赖项

~2.5–4MB
~92K SLoC