41个版本 (5个稳定版本)
新版本 1.0.5 | 2024年8月20日 |
---|---|
0.5.1 | 2024年8月1日 |
0.5.0-alpha2 | 2024年7月25日 |
0.1.6 | 2024年1月21日 |
0.1.4 | 2023年12月26日 |
在加密学分类中排名第268
每月下载量1,846次
33KB
346 行
导入
[dependencies]
encrypt_config = { version = "1.0", features = ["full"] }
[profile.dev.package.num-bigint-dig]
opt-level = 3
注意
在Linux上,重启或长时间未使用后,密钥将过期或被删除。因此,RSA私钥将丢失,这导致此crate无法解密加密的配置文件。
关于项目
有时,我们需要在应用程序中存储我们不想公开的配置。例如,数据库密码、API密钥等。
一种解决方案是将它们存储在操作系统的密钥管理器中,例如,在macOS上为Keychain
,在Windows上为Credential Manager
,在Linux上为libsecret
。
然而,它们通常对密钥长度有限制。例如,Keychain
只允许255字节密钥,Credential Manager
甚至更短。因此,我们无法在其中存储较长的密钥。
另一种解决方案是将密钥存储在文件中,并用RSA公钥对其进行加密,然后将私钥存储在操作系统的密钥管理器中。这正是此crate所做的工作。
此crate提供了3种管理配置的方法
NormalSource
:一个普通源,不持久化或加密PersistSource
:一个将持久化到本地文件但未加密的源SecretSource
:将被持久化到本地文件并加密的数据源
该软件包还有一些可选功能
persist
:如果启用,您可以使用PersistSource
特性。secret
:如果启用,您可以使用PersistSource
和SecretSource
特性。mock
:如果启用,您可以使用用于测试的模拟,它不会使用操作系统的密钥管理器。default_config_dir
:如果启用,将使用默认配置目录。通过dirs实现。
此外,随着开发的进展,添加了用于持久数据访问加速的内存缓存设计。这使得该软件包实际上表现得更像bevy_ecs的资源系统(或仅实现了参数检索的依赖注入)。缓存作为一个独立的软件包rom_cache发布。
该软件包中的Config
是对rom_cache的Cache的包装,只有当配置被修改并标记为脏时,数据才会持久化到存储。
(返回顶部)
构建工具
- Rust
- 密钥环
(返回顶部)
用法
示例
# #[cfg(all(feature = "full", feature = "mock", feature = "default_config_dir"))]
# {
use encrypt_config::{Config, NormalSource, PersistSource, SecretSource};
use serde::{Deserialize, Serialize};
use std::sync::OnceLock;
#[derive(Default, NormalSource)]
struct NormalConfig {
count: usize,
}
#[derive(Default, Serialize, Deserialize, PersistSource)]
#[source(name = "persist_config.json")]
struct PersistConfig {
name: String,
age: usize,
}
#[derive(Default, Serialize, Deserialize, SecretSource)]
#[source(name = "secret_config", keyring_entry = "secret")]
struct SecretConfig {
password: String,
}
{
// Here we have 2 kinds of config at the same time at most, so N is 2
let cfg: Config<2> = Config::default();
{
let normal = cfg.get::<NormalConfig>();
// default value
assert_eq!(normal.count, 0);
}
{
let mut normal = cfg.get_mut::<NormalConfig>();
normal.count = 42;
assert_eq!(normal.count, 42);
}
{
let mut persist = cfg.get_mut::<PersistConfig>();
persist.name = "Louis".to_string();
persist.age = 22;
let mut secret = cfg.get_mut::<SecretConfig>();
secret.password = "123456".to_string();
}
// Changes will be saved automatically as Config dropped
}
{
// Assume this is a new config in the next start
// Here we have 1 kinds of config at the same time at most, so N is 1
let cfg: Config<1> = Config::default();
{
// normal config will not be saved
assert_eq!(cfg.get::<NormalConfig>().count, 0);
// persist config will be saved
assert_eq!(cfg.get::<PersistConfig>().name, "Louis");
// secret config will be encrypted
assert_eq!(cfg.get::<SecretConfig>().password, "123456");
}
// The secret config file should not be able to load directly
let encrypted_file = std::fs::File::open(SecretConfig::path()).unwrap();
assert!(serde_json::from_reader::<_, SecretConfig>(encrypted_file).is_err());
}
# }
(返回顶部)
变更日志
- 0.5.x -> 1.0.x:Linux和其他系统之间没有功能差异;用户定义缓存大小
- 0.4.x -> 0.5.x:现在,
Config
中的缓存现在表现得像本机缓存。更改将作为Config
自动丢弃而保存。 - v0.3.x -> v0.4.x:现在,
Config
中的缓存现在表现得更像本机缓存。更改将作为ConfigMut
自动丢弃而保存。 - v0.2.x -> v0.3.x:现在,可以通过
Config
一次性保存和加载多个配置源。但是移除了add_xx_source
。顺便说一句,可以通过实现Source
特性来定义自己的源,同时仍然提供NormalSource
、PersistSource
和SecretSource
。 - v0.1.x -> v0.2.x:进行了破坏性变更。通过
std::any
和方法从dependencies injection
进行了大量重构。
(返回顶部)
路线图
- 启用protobuf而不是json以获得更好的性能
请参阅开放问题以获取提议的功能(和已知问题)的完整列表。
(返回顶部)
贡献
贡献是使开源社区成为一个如此神奇的学习、灵感和创造之地的原因。您所做的任何贡献都将受到高度重视。
如果您有改进此项目的建议,请fork仓库并创建一个pull请求。您也可以简单地打开一个带有“增强”标签的问题。别忘了给项目加星!再次感谢!
- fork项目
- 创建您的功能分支(
git checkout -b feature/AmazingFeature
) - 提交您的更改 (
git commit -m '添加一些惊人的功能'
) - 推送到分支 (
git push origin feature/AmazingFeature
) - 打开一个拉取请求
(返回顶部)
许可协议
根据MIT许可证分发。更多信息请参阅LICENSE.txt
(返回顶部)
联系方式
路易斯 - [email protected]
项目链接: https://github.com/kingwingfly/encrypt-config
(返回顶部)
依赖关系
~2–30MB
~439K SLoC