1 个不稳定版本
0.0.0 | 2021 年 9 月 5 日 |
---|
#23 in #allocate
2KB
secmem-alloc
secmem-alloc
是一个用于分配私有/机密内存的 crate。它旨在用于在内存中存储加密机密信息。此 crate 提供了使用各种技术改进内存保密性的自定义分配器,最显著的是释放时的零化。
示例
例如,我们从标准输入读取一个机密密码,希望在释放(分配)时将其零化。请注意,此代码会在提示符中留下密码可见;它只是为了说明如何使用此 crate。
#![feature(allocator_api)]
// requires `nightly_allocator_api` crate feature to be enabled and a nightly compiler
use secmem_alloc::allocator_api::Allocator;
use secmem_alloc::zeroizing_alloc::ZeroizeAlloc;
use std::alloc::Global;
fn read_password<A: Allocator>(buf: &mut Vec<u8, A>) {
// query password from the user and put it in `buf`
}
fn main() {
println!("Please enter your password: ");
let mut stdin = std::io::stdin();
let allocator = ZeroizeAlloc::new(Global);
let mut password = Vec::new_in(allocator);
read_password(&mut password);
// use `password` however you like
// you can even grow and shrink the vector `password` and if it needs to be reallocated, the
// old allocation is immediately zeroized
// password is automatically zeroized on drop (deallocation)
}
作为第二个示例,假设您有一个 256 字节的加密密钥,它在释放时应被零化。此外,我们不想将密钥写入交换区。
// requires no crate features and works on stable
// if you enable the `nightly_allocator_api` crate feature, the following line is necessary
#![feature(allocator_api)]
use secmem_alloc::allocator_api::Allocator;
use secmem_alloc::boxed::Box;
use secmem_alloc::sec_alloc::SecStackSinglePageAlloc;
fn get_secret_key<A: Allocator>(buf: &mut Box<[u8; 256], A>) {
// fill `buf` with the bytes of the secret key
}
fn main() {
let allocator: SecStackSinglePageAlloc =
SecStackSinglePageAlloc::new().expect("could not create allocator");
let mut key = Box::new_in([0_u8; 256], &allocator);
get_secret_key(&mut key);
// use `key` however you like
// `key` will not be written to swap except possibly on hibernation
// `key` is automatically zeroized on drop (deallocation)
}
Cargo 功能
std
(默认): 启用需要std
的功能。目前仅用于Error
实现,并且需要用于测试。此功能默认启用。nightly_allocator_api
(需要 nightly): 使用标准库中的 nightly 分配器 API(实际上是core
crate),通过 nightly-only 功能allocator_api
隔离。禁用时,将使用包含在本 crate 中的分配器 API 的副本,通过secmem_alloc::allocator_api
提供。此功能需要 nightly 编译器。nightly_core_intrinsics
(需要 nightly): 使用标准库中的 intrinsic(实际上是core
crate),通过 nightly-only 功能core_intrinsics
隔离。这启用了极快的VolatileMemsetZeroizer
零化器以及各种其他小优化。此功能需要 nightly 编译器。nightly_stdsimd
(需要 nightly): 用于标准库中的 avx512 simd API,但目前未使用。此功能需要 nightly 编译器。nightly_strict_provenance
(需要 nightly): 启用严格的 provenance 检查并(主要)使用标准库提供的严格 provenance API 而不是sptr
提供的 API。(仍将依赖于并在一些地方使用sptr
。)nightly
(需要nightly版本):启用所有仅限于nightly版本的功能(即上述两项)。当可使用nightly编译器时,强烈建议启用此功能。此功能需要nightly编译器。dev
(需要nightly版本):此功能启用运行测试套件所需的所有功能,并且只为该目的启用。当前此功能需要nightly编译器。
待办事项
- 编写更全面的readme
- 改进文档
变更日志
请参阅 CHANGELOG.md
。
文档
secmem-alloc
的API文档可在 https://docs.rs/secmem-alloc/*/secmem_alloc/ 查找。