DPAPI输出缓冲区内存管理



我在我的应用程序中使用CryptProtectData()CryptUnprotectData()api进行数据加密和解密。

阅读API文档,不清楚为什么LocalFree()需要在使用后对输出缓冲区调用。该页上的示例代码没有调用LocalFree(),这是一个错误吗?

文档中还缺少什么(这个问题的主要原因)是,DPAPI如何管理输出的DATA_BLOB::pbData?我可以自己管理输出缓冲区的内存吗?如果可以,我如何提前知道加密数据的输出缓冲区大小,以便分配足够大的缓冲区供CryptProtectData()CryptUnprotectData()使用?

下面是我如何使用CryptProtectData()的代码片段:

DATA_BLOB dataIn;
DATA_BLOB dataOut;
dataIn.pbData = (BYTE *)"Hello world";
dataIn.cbData = (DWORD)strlen((char*)pbDataInput);
if(CryptProtectData(&dataIn, NULL, NULL, NULL, NULL, 0, &dataOut))
{
printf("Encrypted data size: %d", dataOut.cbData);
// LocalFree(dataOut.pbData); // Is this needed? Why? How do I manage dataOut.pbData by myself?
}

阅读API文档,不清楚为什么LocalFree()需要在使用后针对输出缓冲区调用。

因为CryptProtectData()动态地分配一个输出缓冲区并把它给你,所以你需要在你用完它后释放它。

该页上的示例代码没有调用LocalFree(),这是一个错过吗?

是的。

DATA_BLOB::pbData如何由DPAPI管理的输出?我可以自己管理输出缓冲区的内存吗?

不与CryptProtectData(),没有。你必须使用它给你的缓冲区。

如果您想使用自己的缓冲区,请使用CryptProtectMemory()

如果可以,我如何提前知道加密数据的输出缓冲区大小,以便我可以分配一个足够大的缓冲区供CryptProtectData()CryptUnprotectData()使用?

CryptProtectData()在分配动态输出缓冲区时为您处理。

CryptProtectMemory()内联加密,对输入和输出使用相同的缓冲区。因此,您有责任确保缓冲区足够大以容纳输出。它的文档说:

[in] cbDataIn

pData参数指向的要加密的内存字节数。字节数必须是Wincrypt.h中定义的CRYPTPROTECTMEMORY_BLOCK_SIZE常量的倍数。

因此,您只需取输入数据的大小并将其四舍五入到块大小的下一个倍数。

相关内容

  • 没有找到相关文章

最新更新