#secret #service-provider #service #portal #keyring #keychain #linux

oo7

詹姆斯·邦德执行了一项新的任务,这次他作为秘密服务提供商

18次发布

0.3.3 2024年6月18日
0.3.0 2024年2月18日
0.2.1 2023年8月12日
0.1.2 2023年4月16日
0.1.0-alpha.52022年6月3日

#42 in Unix API

Download history 3656/week @ 2024-05-04 2580/week @ 2024-05-11 2243/week @ 2024-05-18 2287/week @ 2024-05-25 1973/week @ 2024-06-01 2042/week @ 2024-06-08 3980/week @ 2024-06-15 2926/week @ 2024-06-22 2502/week @ 2024-06-29 3360/week @ 2024-07-06 2569/week @ 2024-07-13 1707/week @ 2024-07-20 2770/week @ 2024-07-27 1935/week @ 2024-08-03 1478/week @ 2024-08-10 1451/week @ 2024-08-17

7,913 每月下载量
用于 oo7-cli

MIT 许可证

175KB
4K SLoC

OO7

docs crates.io CI

詹姆斯·邦德执行了一项新的任务,这次他作为 秘密服务提供商

该库包含两个模块

  • 使用 zbus 实现秘密服务规范。它将秘密发送到存储在某个安全位置的DBus实现 org.freedesktop.Secrets 接口。

  • 使用 org.freedesktop.portal.Secrets 门户的文件后端来检索用于加密文件的服务的密钥。文件格式与 libsecret 兼容。

沙箱应用程序应优先使用文件后端,因为它不会将应用程序的秘密暴露给其他可以与 org.freedesktop.Secrets 服务通信的沙箱应用程序。

该库提供存储和检索秘密的辅助方法,并根据应用程序是否为沙箱应用程序,使用DBus接口或文件后端。

目标

  • 仅异步API
  • 易于使用
  • 沙箱环境下的 秘密门户 集成
  • 提供从主机秘密迁移到沙箱秘密的API

示例

基本用法

use std::collections::HashMap;

async fn run() -> oo7::Result<()> {
    let keyring = oo7::Keyring::new().await?;
    let attributes = HashMap::from([("attribute", "attribute_value")]);

    // Store a secret
    keyring
        .create_item("Item Label", &attributes, b"secret", true).await?;

    // Find a stored secret
    let items = keyring.search_items(&attributes).await?;

    // Delete a stored secret
    keyring.delete(&attributes).await?;

    // Unlock the collection if the Secret Service is used
    keyring.unlock().await?;

    // Lock the collection if the Secret Service is used
    keyring.lock().await?;
    Ok(())
}

如果您的应用程序大量使用密钥环,例如密码管理器,您可以将 Keyring 的实例存储在 OnceCell / OnceLock / Lazy

use std::sync::OnceLock;
use std::collections::HashMap;

static KEYRING: OnceLock<oo7::Keyring> = OnceLock::new();

fn main() {
    // SOME_RUNTIME could be a tokio/async-std/glib runtime
    SOME_RUNTIME.block_on(async {
        let keyring = oo7::Keyring::new()
            .await
            .expect("Failed to start Secret Service");
        KEYRING.set(keyring);
    });

    // Then to use it
    SOME_RUNTIME.spawn(async {
        let items = KEYRING
            .get()
            .unwrap()
            .search_items(&HashMap::from([("attribute", "attribute_value")]))
            .await;
    });
}

将您的秘密迁移到文件后端

该库还提供API,可从主机密钥服务迁移秘密到沙盒文件后端。请注意,如果迁移成功,这些项目将从主机密钥环中删除。

use std::collections::HashMap;

// SOME_RUNTIME could be a tokio/async-std/glib runtime
SOME_RUNTIME.block_on(async {
    match oo7::migrate(vec![HashMap::from([("attribute", "attribute_value")])], true).await {
        Ok(_) => {
            // Store somewhere the migration happened, to avoid re-doing it at every startup
        }
        Err(err) => log::error!("Failed to migrate secrets {err}"),
    }
});

可选功能

功能 描述 默认
跟踪 使用跟踪库记录各种调试信息
async-std 使用async-std API进行IO/文件系统操作
tokio 使用tokio API进行IO/文件系统操作
native_crypto 使用Rust加密包进行加密原语
openssl_crypto 使用openssl包进行加密原语
不稳定 解锁内部API

与其他库相比如何?

许可证

该项目在MIT许可证下发布。

致谢

依赖项

~8–21MB
~300K SLoC