繁体   English   中英

C ++加密内存中的变量

[英]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";

这有两个原因:

  1. 通过在代码中使用字符串文字"Test String" ,可以使字符串成为程序的一部分。 你必须以其他方式在内存中组装字符串。

  2. LPSTR是指向字符串的长指针。 所以你在受保护的块中放入一个指向字符串的指针。 然后,通过保护块,您保护该指针。 但指针不是你想要保护的,你想要保护字符串本身。 因此,您需要将字符串数据本身放入受保护的块中,而不是指向它的指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM