4 个版本 (1 个稳定版)
1.0.0 | 2021年4月5日 |
---|---|
0.99.4 | 2018年1月11日 |
0.99.3 | 2017年12月28日 |
#809 在 编码
1,324 每月下载次数
在 2 crates 中使用
18KB
351 行
sec
sec
crate 防止机密信息意外通过 Debug
或 Display
实现泄露。有关详细信息,请参阅文档。
lib.rs
:
sec
sec
crate 防止机密信息意外通过 Debug
或 Display
实现泄露。它是通过将任何类型的机密信息包装在零开销类型中实现的。
use sec::Secret;
#[derive(Debug)]
struct User {
id: usize,
username: String,
session_token: Secret<String>,
}
let alice = User{
id: 1,
username: "alice".to_owned(),
session_token: Secret::new("no one should see this".to_owned()),
};
println!("Now talking to: {:?}", alice);
这将产生以下输出
Now talking to: User{ id = 1, username: String("alice"), session_token: "..." }
当处理应该始终防止意外泄露的数据时,此功能非常有用,例如通过恐慌或日志文件。
可以使用任何 reveal
方法访问包含的数据
#
#
#
println!("Don't tell anyone, but Alice's token is: {}",
alice.session_token.reveal());
只有名称中包含 reveal
的方法才能真正允许访问秘密值。
Serde 支持(deserialize/serialize
功能)
serialize
功能)如果启用 deserialize
功能,则任何 Secret<T>
将自动实现 Deserialize
从 Serde
#[derive(Deserialize)]
struct AuthRequest{
username: String,
password: Secret<String>,
}
AuthRequest
将作为 password
是一个常规 String
进行反序列化,结果将存储为 Secret<String>
。此外,如果发生任何反序列化错误,将替换生成的 serde 错误以避免泄露未解析的值。
可以通过 serialize
功能启用序列化。
重要:将数据序列化为可读格式仍然是一种泄露机密信息的方式。只有需要时才启用此功能。
Diesel 支持(diesel_sql
功能)
通过 Diesel 插入和加载 Secret<T>
值的支持有限,可以通过启用 diesel_sql
功能来启用。
重要:数据库可能会记录并回显(在出错时)任何失败的查询、执行时间过长或其他被认为有趣的查询。在表达式中使用 Secret
值应予以避免。
no_std
支持
通过禁用默认功能,支持 no_std
。可以通过 std
功能重新启用。
额外特性
为 Secret
实现了 PartialEq
、Eq
和 Hash
特性,通过简单地将操作传递到底层类型。这些特性应该不会意外泄露封装的秘密。
此外,通过启用 ord
功能,将实现 PartialOrd
和 Ord
特性。由于排序可能会在按顺序打印按 Secret 排序的集合时泄露信息,因此这些特性默认为可选。
安全性
虽然 sec
通常能够很好地防止因日志记录错误而意外泄露,但它目前并不保护实际内存(虽然并非不可能,但由于堆分配需要大量额外努力,这并不容易)。通常,由 sec 保护的数据会在网络上发送,并在不同应用程序之间传递(例如,授权客户端的令牌)或可以作为 HashMap 的密钥合理使用。
为了防止在应用程序内部复制,数据通常仅在堆上分配并在分配后擦除。在这里,sec
通过不支持此模式在性能和通用性方面做出了权衡。它并不是为了保护您的 GPG 私钥免于核心转储,而是为了防止登录令牌意外泄露。
如果您担心在内存中保护加密秘密免于堆转储和类似情况,请参阅 [secrets](《https://crates.org.cn/crates/secrets》)、[secstr](《https://crates.org.cn/crates/secstr》)或类似软件包。
依赖关系
~0–770KB
~16K SLoC