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.5 | 2022年6月3日 |
#42 in Unix API
7,913 每月下载量
用于 oo7-cli
175KB
4K SLoC
OO7
詹姆斯·邦德执行了一项新的任务,这次他作为 秘密服务提供商。
该库包含两个模块
-
使用 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 | 否 |
与其他库相比如何?
-
libsecret-rs提供了C库libsecret的Rust绑定。当前的主要痛点在于它为你做了假设,因此它将使用主机或基于沙盒文件的密钥环,这使得将秘密迁移到沙盒内部可能是一项不可能的任务。还有一些问题,如https://gitlab.gnome.org/GNOME/libsecret/-/issues/58,使其无法在Flatpak沙盒中使用。
-
secret-service-rs也内部使用zbus,但仅提供同步API,有一段时间没有更新,如果沙盒化则不与Secret portal集成。
许可证
该项目在MIT许可证下发布。
致谢
- secret-service-rs为加密秘密服务实现。
依赖项
~8–21MB
~300K SLoC