rust clear_on_drop库

本文介绍clear_on_drop机制,一种确保密码学密钥等敏感数据在不再使用时被清除的方法。该机制通过两种方式实现:一是利用ClearOnDrop确保敏感数据在生命周期结束时被清理;二是使用clear_stack_on_return函数重写栈空间数据。此外,文章还探讨了如何避免编译器优化对清理操作的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://github.com/cesarb/clear_on_drop
可用于清理不再需要使用的密码学key和中间值。
用于清理栈空间和堆空间的敏感数据,但是无法排除程序外部工具依然能获得这些数据(如通过debugger,或者通过对硬件的物理访问等)。对于长期活跃的进程,key信息仍然可能通过内存获取。

本文为对 https://lib.rs/crates/clear_on_drop 内容的翻译。

1. clear_on_drop清理敏感数据机制

主要有两个机制来处理残余数据:
1)ClearOnDrop通过对敏感数据(如密码状态)的mutable引用,来保证当数据drop时也被清理。可通过使用Box<T>mlock来将数据保持在heap堆中。
2)clear_stack_on_return函数调用闭包,然后返回,会往stack栈空间中重写几千字节的数据。通过该方法,可重写覆盖掉密码学算法中的临时变量值,对于短期生存的线程尤其有价值,因为当线程结束时,线程栈空间所使用的内存不容易被重刷。

2. clear_on_drop防止编译器优化机制

编译器在编译时,会判断数据在cleared后是否有使用,若无使用,编译器会忽略相应的clearing代码。同时,便以及可能会被调用的函数和相应的栈空间clearing代码,分别对应使用栈空间的不同区域。为了避免这些不必要的优化,clear_on_drop主要有3个机制:
1)通过使用内敛的汇编代码,需要用nightly版本Rust,启用nightly feature,不需要额外的C编译器。
2)默认的是本机制。调用一个dummy C函数。运行在stable Rust版本,但是需要C编译器。
3)第三种机制位采用fallback,通过使用原子指令,用于迷惑编译器。本机制使用时需启用no_cc feature,可运行在stable Rust版本且不需要C编译器,但是目前不太稳定。使用时需慎重。

参考资料:
[1] https://github.com/cesarb/clear_on_drop
[2] https://lib.rs/crates/clear_on_drop

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值