#config-directory #encryption #default-config #secret #config #store #key-store

encrypt_config

一个Rust crate,用于管理、持久化和加密您的配置

41个版本 (5个稳定版本)

新版本 1.0.5 2024年8月20日
0.5.1 2024年8月1日
0.5.0-alpha22024年7月25日
0.1.6 2024年1月21日
0.1.4 2023年12月26日

加密学分类中排名第268

Download history 41/week @ 2024-05-01 22/week @ 2024-05-08 23/week @ 2024-05-15 22/week @ 2024-05-22 19/week @ 2024-05-29 28/week @ 2024-06-05 497/week @ 2024-06-12 1220/week @ 2024-06-19 520/week @ 2024-06-26 176/week @ 2024-07-03 27/week @ 2024-07-10 98/week @ 2024-07-17 637/week @ 2024-07-24 382/week @ 2024-07-31 319/week @ 2024-08-07 421/week @ 2024-08-14

每月下载量1,846

MIT协议

33KB
346

Contributors Forks Stargazers Issues MIT License


encrypt-config

一个rust crate,用于管理、持久化和加密您的配置。
查看文档»

查看演示 · 报告错误 · 请求功能

目录
  1. 导入
  2. 关于项目
  3. 用法
  4. 变更日志
  5. 路线图
  6. 贡献
  7. 许可协议
  8. 联系方式
  9. 致谢

导入

[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:如果启用,您可以使用PersistSourceSecretSource特性。
  • mock:如果启用,您可以使用用于测试的模拟,它不会使用操作系统的密钥管理器。
  • default_config_dir:如果启用,将使用默认配置目录。通过dirs实现。

此外,随着开发的进展,添加了用于持久数据访问加速的内存缓存设计。这使得该软件包实际上表现得更像bevy_ecs的资源系统(或仅实现了参数检索的依赖注入)。缓存作为一个独立的软件包rom_cache发布。

该软件包中的Config是对rom_cacheCache的包装,只有当配置被修改并标记为脏时,数据才会持久化到存储。

(返回顶部)

构建工具

  • 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特性来定义自己的源,同时仍然提供NormalSourcePersistSourceSecretSource
  • v0.1.x -> v0.2.x:进行了破坏性变更。通过std::any和方法从dependencies injection进行了大量重构。

更详细的变更日志

(返回顶部)

路线图

  • 启用protobuf而不是json以获得更好的性能

请参阅开放问题以获取提议的功能(和已知问题)的完整列表。

(返回顶部)

贡献

贡献是使开源社区成为一个如此神奇的学习、灵感和创造之地的原因。您所做的任何贡献都将受到高度重视。

如果您有改进此项目的建议,请fork仓库并创建一个pull请求。您也可以简单地打开一个带有“增强”标签的问题。别忘了给项目加星!再次感谢!

  1. fork项目
  2. 创建您的功能分支(git checkout -b feature/AmazingFeature
  3. 提交您的更改 (git commit -m '添加一些惊人的功能')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 打开一个拉取请求

(返回顶部)

许可协议

根据MIT许可证分发。更多信息请参阅LICENSE.txt

(返回顶部)

联系方式

路易斯 - [email protected]

项目链接: https://github.com/kingwingfly/encrypt-config

(返回顶部)

依赖关系

~2–30MB
~439K SLoC