1 个不稳定版本

0.0.0 2021 年 9 月 5 日

#23 in #allocate

MIT/Apache

2KB

secmem-alloc 许可: MIT OR Apache-2.0 secmem-alloc on crates.io 源代码仓库

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/ 查找。

无运行时依赖