我在我的应用程序中使用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
常量的倍数。
因此,您只需取输入数据的大小并将其四舍五入到块大小的下一个倍数。