[英]C++ Encrypt variables in memory
编辑:我更多地考虑了这一点,并决定只更新和更容易加密内存中的变量,当我想使用它只是解密它。 我尝试使用以下代码:
DWORD blockSize = CRYPTPROTECTMEMORY_BLOCK_SIZE;
int* protectedBlock = (int*)LocalAlloc(LPTR, (SIZE_T)blockSize);
protectedBlock[0] = 1234;
printf("Before encryption: %d\n", protectedBlock[0]);
// OUTPUT: 1234
CryptProtectMemory(protectedBlock, blockSize, CRYPTPROTECTMEMORY_SAME_PROCESS);
printf("After encryption: %d\n", protectedBlock[0]);
// OUTPUT: The encrypted string
CryptUnprotectMemory(protectedBlock, blockSize, CRYPTPROTECTMEMORY_SAME_PROCESS);
printf("After decryption: %d\n", protectedBlock[0]);
//OUTPUT: 1234
SecureZeroMemory(protectedBlock, blockSize);
LocalFree(protectedBlock);
当我想加密整数时它工作正常,但是当我尝试使用字符串(LPCSTR)时,字符串仍然保留在内存中。 这是我使用的代码:
DWORD blockSize = CRYPTPROTECTMEMORY_BLOCK_SIZE;
LPTSTR* protectedBlock = (LPTSTR*)LocalAlloc(LPTR, (SIZE_T)blockSize);
protectedBlock[0] = (LPTSTR)"Test String";
printf("Before encryption: %d\n", protectedBlock[0]);
CryptProtectMemory(protectedBlock, blockSize, CRYPTPROTECTMEMORY_SAME_PROCESS);
printf("After encryption: %d\n", protectedBlock[0]);
// OUTPUT: The encrypted string
CryptUnprotectMemory(protectedBlock, blockSize, CRYPTPROTECTMEMORY_SAME_PROCESS);
cout << "After decryption: " << (char*)protectedBlock[0] << endl;
//OUTPUT: Test String
SecureZeroMemory(protectedBlock, blockSize);
LocalFree(protectedBlock);
哪个“记忆”。 CPU寄存器,RAM,缓存,交换磁盘等。您所问的是一个复杂的问题,您可能会写一本书。
事实上,它可能只在程序集中可行(并且有争议),你可以确定编译器没有做你不知道的某种类型的优化。 即使这并不总是停止CPU寄存器/缓存等。
你应该问自己的真正问题是你想要保护它的人或者是什么。
这里有一些东西可以帮助您解决一些您必须解决的问题。
我首先要考虑加密内存中的变量(这本身可能是一个很大的主题)。
谷歌和一些阅读是你的朋友。
protectedBlock[0] = (LPTSTR)"Test String";
这有两个原因:
通过在代码中使用字符串文字"Test String"
,可以使字符串成为程序的一部分。 你必须以其他方式在内存中组装字符串。
LPSTR
是指向字符串的长指针。 所以你在受保护的块中放入一个指向字符串的指针。 然后,通过保护块,您保护该指针。 但指针不是你想要保护的,你想要保护字符串本身。 因此,您需要将字符串数据本身放入受保护的块中,而不是指向它的指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.