#secret #debugging #prevent #display #information #security #confidential

无 std sec

防止通过 DebugDisplay 特性泄露机密信息

4 个版本 (1 个稳定版)

1.0.0 2021年4月5日
0.99.4 2018年1月11日
0.99.3 2017年12月28日

#809编码

Download history 356/week @ 2024-04-07 392/week @ 2024-04-14 310/week @ 2024-04-21 551/week @ 2024-04-28 407/week @ 2024-05-05 547/week @ 2024-05-12 428/week @ 2024-05-19 206/week @ 2024-05-26 564/week @ 2024-06-02 365/week @ 2024-06-09 361/week @ 2024-06-16 344/week @ 2024-06-23 140/week @ 2024-06-30 518/week @ 2024-07-07 300/week @ 2024-07-14 366/week @ 2024-07-21

1,324 每月下载次数
2 crates 中使用

MIT 许可证

18KB
351

sec

Crates.io version

sec crate 防止机密信息意外通过 DebugDisplay 实现泄露。有关详细信息,请参阅文档


lib.rs:

sec

sec crate 防止机密信息意外通过 DebugDisplay 实现泄露。它是通过将任何类型的机密信息包装在零开销类型中实现的。

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 功能)

如果启用 deserialize 功能,则任何 Secret<T> 将自动实现 DeserializeSerde

#[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 实现了 PartialEqEqHash 特性,通过简单地将操作传递到底层类型。这些特性应该不会意外泄露封装的秘密。

此外,通过启用 ord 功能,将实现 PartialOrdOrd 特性。由于排序可能会在按顺序打印按 Secret 排序的集合时泄露信息,因此这些特性默认为可选。

安全性

虽然 sec 通常能够很好地防止因日志记录错误而意外泄露,但它目前并不保护实际内存(虽然并非不可能,但由于堆分配需要大量额外努力,这并不容易)。通常,由 sec 保护的数据会在网络上发送,并在不同应用程序之间传递(例如,授权客户端的令牌)或可以作为 HashMap 的密钥合理使用。

为了防止在应用程序内部复制,数据通常仅在堆上分配并在分配后擦除。在这里,sec 通过不支持此模式在性能和通用性方面做出了权衡。它并不是为了保护您的 GPG 私钥免于核心转储,而是为了防止登录令牌意外泄露。

如果您担心在内存中保护加密秘密免于堆转储和类似情况,请参阅 [secrets](《https://crates.org.cn/crates/secrets》)、[secstr](《https://crates.org.cn/crates/secstr》)或类似软件包。

依赖关系

~0–770KB
~16K SLoC