#zeroize #memory #stack #data #heap-memory #sensitive #clear-stack

no-std clear_on_drop

堆栈和堆上清除敏感数据的辅助工具

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 加密学

Download history 15359/week @ 2024-03-14 11033/week @ 2024-03-21 9011/week @ 2024-03-28 7130/week @ 2024-04-04 7430/week @ 2024-04-11 9510/week @ 2024-04-18 7544/week @ 2024-04-25 5950/week @ 2024-05-02 7044/week @ 2024-05-09 7089/week @ 2024-05-16 6459/week @ 2024-05-23 6808/week @ 2024-05-30 6519/week @ 2024-06-06 9711/week @ 2024-06-13 10066/week @ 2024-06-20 7344/week @ 2024-06-27

34,814 每月下载量
287 个crate中(48个直接使用)

MIT/Apache

29KB
548

堆栈和堆上清除敏感数据的辅助工具

某些类型的数据不应该在内存中保留超过它们所需的时间。例如,加密密钥和中间值应该在不再需要时立即删除。

Rust语言有助于防止意外读取堆栈或堆中剩余的值;然而,程序外的手段(例如调试器,甚至物理访问硬件)仍然可以读取剩余的值。对于长期运行的过程,密钥材料可能在应该被丢弃之后很久还留在内存中。

此crate提供两种机制来帮助最小化剩余数据。

ClearOnDrop 包装器持有对敏感数据(例如,加密状态)的可变引用,并在丢弃时清除数据。在保持可变引用时,数据不能被移动,因此不会因为移动而产生剩余数据;包装器本身可以被自由移动。或者,它可以持有堆上的数据(使用 Box<T>,或者可能是类似的从 mlocked堆分配的类似结构)。

clear_stack_on_return 函数调用一个闭包,并在它返回后覆盖几个千字节大小的堆栈。这可以帮助覆盖加密算法使用的临时变量,并且在短生命周期的线程上运行时特别相关,因为线程堆栈使用的内存无法在线程终止后轻松覆盖。

防止编译器优化

如果编译器确定在清除后数据不再被使用,则可以省略清除代码。此外,编译器还可以内联调用函数和堆栈清除代码,为每个使用单独的堆栈区域。此crate有三个机制可以防止这些不希望的优化,这些机制通过编译时通过cargo功能选择。

最快的机制使用内联汇编,这仅在nightly Rust中可用。它通过 nightly 功能启用,不需要工作的C编译器。

第二种机制是默认机制,它调用一个虚拟C函数。它在稳定的Rust上工作,但需要一个工作的C编译器。

第三种机制是一个后备方案,通过使用原子指令试图迷惑优化器。除非必要,否则不应使用,因为它不够可靠。它通过 no_cc 功能启用,在稳定的 Rust 上工作,且不需要 C 编译器。

许可证

根据以下任一许可证授权:

您可选择其中之一。

贡献

除非您明确说明,否则根据 Apache-2.0 许可证定义的,您提交给作品以包含在内的任何贡献,将按照上述方式双重许可,不附加任何额外条款或条件。

无运行时依赖

约 180KB