7个版本
0.2.5 | 2022年4月16日 |
---|---|
0.2.4 | 2020年6月4日 |
0.2.3 | 2017年12月3日 |
0.2.2 | 2017年8月25日 |
0.1.0 | 2017年1月14日 |
#745 in 加密学
34,814 每月下载量
在 287 个crate中(48个直接使用)
29KB
548 行
堆栈和堆上清除敏感数据的辅助工具
某些类型的数据不应该在内存中保留超过它们所需的时间。例如,加密密钥和中间值应该在不再需要时立即删除。
Rust语言有助于防止意外读取堆栈或堆中剩余的值;然而,程序外的手段(例如调试器,甚至物理访问硬件)仍然可以读取剩余的值。对于长期运行的过程,密钥材料可能在应该被丢弃之后很久还留在内存中。
此crate提供两种机制来帮助最小化剩余数据。
ClearOnDrop
包装器持有对敏感数据(例如,加密状态)的可变引用,并在丢弃时清除数据。在保持可变引用时,数据不能被移动,因此不会因为移动而产生剩余数据;包装器本身可以被自由移动。或者,它可以持有堆上的数据(使用 Box<T>
,或者可能是类似的从 mlock
ed堆分配的类似结构)。
clear_stack_on_return
函数调用一个闭包,并在它返回后覆盖几个千字节大小的堆栈。这可以帮助覆盖加密算法使用的临时变量,并且在短生命周期的线程上运行时特别相关,因为线程堆栈使用的内存无法在线程终止后轻松覆盖。
防止编译器优化
如果编译器确定在清除后数据不再被使用,则可以省略清除代码。此外,编译器还可以内联调用函数和堆栈清除代码,为每个使用单独的堆栈区域。此crate有三个机制可以防止这些不希望的优化,这些机制通过编译时通过cargo功能选择。
最快的机制使用内联汇编,这仅在nightly Rust中可用。它通过 nightly
功能启用,不需要工作的C编译器。
第二种机制是默认机制,它调用一个虚拟C函数。它在稳定的Rust上工作,但需要一个工作的C编译器。
第三种机制是一个后备方案,通过使用原子指令试图迷惑优化器。除非必要,否则不应使用,因为它不够可靠。它通过 no_cc
功能启用,在稳定的 Rust 上工作,且不需要 C 编译器。
许可证
根据以下任一许可证授权:
- Apache 许可证 2.0 版(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
您可选择其中之一。
贡献
除非您明确说明,否则根据 Apache-2.0 许可证定义的,您提交给作品以包含在内的任何贡献,将按照上述方式双重许可,不附加任何额外条款或条件。
无运行时依赖
约 180KB