9 个不稳定版本
0.5.1 | 2022 年 10 月 2 日 |
---|---|
0.5.0 | 2022 年 3 月 13 日 |
0.4.0 | 2020 年 2 月 8 日 |
0.3.2 | 2019 年 5 月 23 日 |
0.1.0 | 2015 年 9 月 9 日 |
#775 in 密码学
21,363 每月下载量
在 40 个crate(21 个直接)中使用
47KB
959 行
secstr
一个 Rust 库,实现了适合在内存中存储敏感信息(如密码和私钥)的数据类型(封装在 Vec<u8>
中的包装器)。受 Haskell securemem 和 .NET SecureString 启发。
特性
- 恒等时间比较(不在第一个不同字符时短路;但如果有不同长度的字符串则立即终止)
- 在析构函数中自动清零
- 如果可能,提供
mlock
和madvise
保护 - 格式化为
***SECRET***
以防止泄露到日志中 - (可选)通过 sodiumoxide 的 libsodium-sys 使用libsodium进行清零、比较和散列(
std::hash::Hash
) - (可选)将序列化/反序列化到 Serde 支持的任何字节字符串
- (可选)编译时检查公共
unsafe
API 的 preconditions
用法
extern crate secstr;
use secstr::*;
let pw = SecStr::from("correct horse battery staple");
// Compared in constant time:
// (Obviously, you should store hashes in real apps, not plaintext passwords)
let are_pws_equal = pw == SecStr::from("correct horse battery staple".to_string()); // true
// Formatting, printing without leaking secrets into logs
let text_to_print = format!("{}", SecStr::from("hello")); // "***SECRET***"
// Clearing memory
// THIS IS DONE AUTOMATICALLY IN THE DESTRUCTOR
// (but you can force it)
let mut my_sec = SecStr::from("hello");
my_sec.zero_out();
// (It also sets the length to 0)
assert_eq!(my_sec.unsecure(), b"");
小心使用 SecStr::from
:如果您有一个借用字符串,它将被复制。
如果有一个 Vec<u8>
,请使用 SecStr::new
。
贡献
请随时提交拉取请求!
通过参与此项目,您同意遵守 贡献者行为准则 并在 Unlicense 下发布您的贡献。
许可
这是一款免费且不受限制的软件,已发布到公共领域。
如需更多信息,请参阅 UNLICENSE
文件或访问 unlicense.org。
依赖项
~0–4.5MB
~25K SLoC