2个版本

使用旧Rust 2015

0.1.1 2016年7月30日
0.1.0 2016年7月30日

#2487 in 密码学

MIT 许可证

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