Mac OS X相当于SecureZeroMemory/RtlSecureZeroMemory?

Dan*_*ien 10 c security macos objective-c memset

是否有一个等同于RtlSecureZeroMemory/ 的Mac OS X SecureZeroMemory,一个将一块内存归零的函数,但编译器不会优化调用?

oua*_*uah 14

编写自己的函数:

void secure_zero(void *s, size_t n)
{
    volatile char *p = s;

    while (n--) *p++ = 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:评论中的问题,为什么不memset呢?的memset函数调用可通过编译器,如果数组对象没有futher访问被优化掉.

请注意,C11添加了(可选)功能memset_s,标准保证函数调用无法优化:

(C11,K.3.7.4.1p4)"[...]与memset不同,任何对memset_s函数的调用都应严格按照(5.1.2.3)中描述的抽象机的规则进行评估.对memset_s函数的调用应假定s和n指示的内存在将来可以访问,因此必须包含c所指示的值.

  • @ Daij-Djan*为什么不memset*:因为如果没有进一步访问数组对象,编译器可以优化掉调用.*看起来非常复杂和臃肿*:这是编写`memset`函数的经典方法,我发现它优雅而简洁. (4认同)
  • @DanielTrebbien:不要屏住呼吸.附件K被大多数人认为是垃圾(它是基于微软接口添加的,这些接口是为了破坏便携式C而发明的,并且认为标准C功能是"不安全的")并且对在大多数系统上实现它没有兴趣. (4认同)
  • 请注意,即使您将缓冲区清零,堆栈上仍可能存在无法安全或可移植消除的痕迹.我已经看到处理这个问题的最好的方法之一是在使用处理敏感数据的结果后,使用虚拟数据而不是敏感数据从同一个调用者重新运行整个opertion.虽然没有严格的*要求*,但这几乎肯定会导致第一次运行中仍然存在于堆栈中的任何内容的破坏.我已经看到这种技术用于加密哈希函数. (2认同)
  • +1我不知道'memset_s`.一旦它变得可用,这听起来像是答案. (2认同)