gpt4 book ai didi

c++ - 我可以使用std::array的自定义分配器来获得安全的加密 key 吗?

转载 作者:行者123 更新时间:2023-12-04 00:45:30 27 4
gpt4 key购买 nike

我知道std::array已完全分配在堆栈中,但是此问题是由需要考虑两点的安全问题引起的:

  • 销毁时,std::array中的数据将置零或随机化
  • std::array中的数据将为locked,这样它无论在崩溃还是在交换内存上都不会进入磁盘

  • 通常,使用 std::vector,解决方案是创建一个 custom allocator,即 does these things。但是,对于 std::array,我看不到如何执行此操作,因此也看不到这个问题。

    我能做的最好的事情是:
    template <typename T, std::size_t Size>
    struct SecureArray : public std::array<T, Size>
    {
    static_assert(std::is_pod<T>::value, "Only POD types allowed")
    static_assert(sizeof(T) == 1, "Only 1-byte types allowed")
    virtual ~SecureArray()
    {
    std::vector<uint8_t> d = RandomBytes(Size); // generates Size random bytes
    std::memcpy(this->data(), d.data(), Size);
    }
    }

    但这显然缺乏内存锁定,并使首先要使用 std::array获得的 std::array的性能方案变得复杂。

    有没有更好的解决方案?

    最佳答案

    std::array不能使用分配器;但是,似乎您的SecureArray类可以通过自定义构造函数/解构函数实现所需的功能。

    像这样的东西:

    #include <sys/mman.h>

    template<class T, std::size_t Size>
    struct SecureArray : public std::array<T, Size>
    {
    // Your static_asserts...

    SecureArray(void) {
    mlock(std::array<T, Size>::data(), sizeof(T) * Size);
    }

    ~SecureArray(void) {
    char *bytes = reinterpret_cast<char *>(std::array<T, Size>::data());
    for (std::size_t i = 0; i < sizeof(T) * Size; i++)
    bytes[i] = 0;
    munlock(bytes, sizeof(T) * N);
    }
    };

    关于c++ - 我可以使用std::array的自定义分配器来获得安全的加密 key 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59225835/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com