#memory-allocator #memory #allocator #secure

no-std secmem-alloc

秘密内存的自定义分配器

5个不稳定版本

新增 0.3.0 2024年8月20日
0.2.2 2024年5月2日
0.2.0 2022年4月12日
0.1.2 2021年12月1日
0.1.1 2021年9月21日

#64内存管理

Download history 209/week @ 2024-05-02 3/week @ 2024-05-30 125/week @ 2024-08-15

每月125次下载

MIT/Apache

86KB
1K SLoC

secmem-alloc 许可证:MIT OR Apache-2.0 secmem-alloc 在crates.io secmem-alloc 在docs.rs 源代码仓库

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(实际上是corecrate),通过nightly-only功能allocator_api进行限制。禁用时,此crate中包含的分配器api的副本将通过secmem_alloc::allocator_api提供。此功能需要nightly编译器。
  • nightly_core_intrinsics(需要nightly版本):使用标准库的 intrinsic(实际上是corecrate),通过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