5个不稳定版本
新增 0.3.0 | 2024年8月20日 |
---|---|
0.2.2 | 2024年5月2日 |
0.2.0 |
|
0.1.2 | 2021年12月1日 |
0.1.1 | 2021年9月21日 |
#64 在 内存管理 中
每月125次下载
86KB
1K SLoC
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, Global, Vec};
use secmem_alloc::zeroizing_alloc::ZeroizeAlloc;
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, 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
进行限制。这允许实现更快的zeroize_mem
,以及其他各种小的优化。此功能需要nightly编译器。nightly_strict_provenance
(需要nightly): 启用严格的来源 lint 并且(主要是)使用标准库提供的严格来源 API 而不是来自sptr
的 API。 (仍将依赖于并在一些地方使用sptr
。)nightly
(需要nightly): 启用所有nightly特有的功能(即上述两个)。当可使用nightly编译器时,启用此功能非常推荐。此功能需要nightly编译器。dev
(需要nightly): 此功能启用运行测试套件所需的所有功能,并且仅应为此目的启用。此功能目前需要nightly编译器。
依赖项
~2–41MB
~638K SLoC