2个版本
使用旧Rust 2015
0.1.1 | 2016年7月30日 |
---|---|
0.1.0 | 2016年7月30日 |
#2487 in 密码学
10KB
174 行
SecBox — 敏感数据容器。
我发现自己在不同的项目中重复实现了这个功能,所以决定将其做成一个库。
secbox
提供了一个原始的尝试,以增强内部数据的保护,防止某些攻击向量。它可以作为构建块用于类似 SecStr
的原始数据。
文档详细说明了使用的方法。
这适用于存储敏感数据,如密码和私钥。
Cargo.toml
secbox = "0.1.0"
示例
// We box the vector, despite only being a container. Techinically, this is
// unnecessary, but it improves the security slightly.
let mut pass = SecBox::new(Vec::new());
for i in ::std::io::stdin().chars() {
match i {
// Stop on enter.
'\n' => break,
// We SecBox it and the push it. SecBoxing it here will protect the
// data through a variety of measures.
i => pass.push(SecBox::new(i)),
}
}
lib.rs
:
SecBox.
这个crate提供了一个安全原始数据 SecBox
,试图限制常见漏洞的损害。
漏洞
-
堆或局部越界索引:通常可以使用缓冲区溢出来读取堆栈,但如果需要解引用元素以获取数据,通常不知道应该偏移多少(即不知道数组开始的地址)。线性扫描是不生产的(特别是数据没有对齐)并且很快就会导致段错误。
-
部分内存转储:通过不连续性避免部分内存转储(例如页面转储或CPU缓存转储),这意味着部分内存段很少包含有趣的数据。
-
交换RAM数据泄露:为了避免将内存写入持久性内存(从而更容易访问),我们将内部数据memlock,确保数据永远不会离开临时内存。
-
读取未初始化的数据:未初始化的读取是Rust中罕见的错误,但在C和C++中很常见,因此这些语言的库的Rust绑定中很常见。因此,我们确保用零覆盖它,并在释放后使其不可访问。
-
崩溃转储数据泄露:由于数据为零,崩溃转储通常在敏感数据的暴露方面受到限制。
注意!
SecBox
并不意味着内部数据完全受到保护。您仍需要确保它得到妥善处理,并且不会通过其他方式泄露。
依赖项
~43KB