【问题标题】:DPAPI output buffer memory managementDPAPI 输出缓冲内存管理
【发布时间】:2021-12-11 10:03:43
【问题描述】:

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

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

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

这是我如何使用CryptProtectData() 的代码 sn-p:

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?
}

【问题讨论】:

    标签: c++ windows security dpapi


    【解决方案1】:

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

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

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

    是的。

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

    不是CryptProtectData(),不是。您必须使用它提供给您的缓冲区。

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

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

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

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

    [in] cbDataIn

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多