我们正在获得PCI PA-DSS认证,其中一项要求是避免将干净的PAN(卡号)写入磁盘.应用程序不会将此类信息写入磁盘,但如果操作系统(在本例中为Windows)需要交换,则将内存内容写入页面文件.因此,应用程序必须清理内存以防止RAM捕获器服务读取敏感数据.
有三种情况需要处理:
memsetmemset例如:
void test()
{
char card_number[17];
strcpy(card_number, "4000000000000000");
}
Run Code Online (Sandbox Code Playgroud)
在执行测试之后,存储器仍然包含card_number信息.
一条指令可以在测试结束时将变量card_number归零,但这应该适用于程序中的所有函数.
memset(card_number, 0, sizeof(card_number));
Run Code Online (Sandbox Code Playgroud)
有没有办法在某个时刻清理堆栈,就像程序结束前一样?
当程序完成时清理堆栈可能为时已晚,它可能已经在运行时的任何时刻被换出。您应该仅将敏感数据保存在使用VirtualLock锁定的内存中,这样它就不会被换出。这必须在读取所述敏感数据之前发生。
您可以像这样锁定多少内存有一个小限制,因此您可能不会锁定整个堆栈,并且应该完全避免在堆栈上存储敏感数据。