gpt4 book ai didi

c++ - 是否需要清理堆栈内容?

转载 作者:可可西里 更新时间:2023-11-01 17:39:59 26 4
gpt4 key购买 nike

我们正在接受 PCI PA-DSS 认证,其要求之一是避免将干净的 PAN(卡号)写入磁盘。应用程序不会将此类信息写入磁盘,但如果操作系统(在本例中为 Windows)需要交换,内存内容将写入页面文件。因此,应用程序必须清理内存以防止 RAM 捕获程序服务读取敏感数据。

需要处理三种情况:

  • 堆分配(malloc):在释放内存之前,可以使用memset清理该区域
  • 静态或全局数据:使用后,可以使用memset清理该区域
  • 本地数据(函数成员):数据入栈,函数结束后不可访问

例如:

void test()
{
char card_number[17];

strcpy(card_number, "4000000000000000");
}

测试执行后,内存中仍然有card_number信息。

一条指令可以在测试结束时将变量 card_number 归零,但这应该适用于程序中的所有函数。

memset(card_number, 0, sizeof(card_number));

有没有办法在某个时候清理堆栈,比如在程序结束之前?

最佳答案

在程序完成时立即清理堆栈可能为时已晚,它可能已经在其运行时的任何时候被换出。您应该只将敏感数据保存在使用 VirtualLock 锁定的内存中所以它不会被换掉。这必须在读取敏感数据之前发生。

像这样可以锁定多少内存有一个小限制,因此您可能不会锁定整个堆栈,并且应该完全避免在堆栈上存储敏感数据。

关于c++ - 是否需要清理堆栈内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44314867/

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