C++ 是否需要手动将PCREDENTIAL.CredentialBlob归零?

C++ 是否需要手动将PCREDENTIAL.CredentialBlob归零?,c++,winapi,credentials,credential-manager,C++,Winapi,Credentials,Credential Manager,我使用的是这样的: PCREDENTIAL cred = nullptr; if (CredRead(entryName, 1, 0, &cred) != TRUE || !cred) return -1; // ... code which handles cred.UserName and cred.CredentialBlob CredFree(cred); 正如你所看到的,我释放了缓冲区。但是,我看到LPBYTE指针CredentialBlob仍然有效,并且仍然在内

我使用的是这样的:

PCREDENTIAL cred = nullptr;
if (CredRead(entryName, 1, 0, &cred) != TRUE || !cred)
    return -1;

// ... code which handles cred.UserName and cred.CredentialBlob

CredFree(cred);
正如你所看到的,我释放了缓冲区。但是,我看到LPBYTE指针CredentialBlob仍然有效,并且仍然在内存中包含密码。我必须手动保存它吗?谁拥有缓冲区?我找不到其他可以这样做的源代码

我没有找到任何内容,仅包含以下通用语句:

使用后从内存中清除凭据数据

使用后不要将凭据留在内存中。使用后,通过调用SecureZeroMemory从临时存储器中清除所有凭据数据

但是,我看到LPBYTE指针CredentialBlob仍然有效

你如何确定这一点?最有可能的情况是,您正在通过读取死掉的内存来提交UB

仍然在内存中包含密码

这更令人担忧,但你引用的文本告诉你该怎么做

但是,我看到LPBYTE指针CredentialBlob仍然有效

你如何确定这一点?最有可能的情况是,您正在通过读取死掉的内存来提交UB

仍然在内存中包含密码

这更令人担忧,但您引用的文本告诉您如何处理它。

您拥有缓冲区。各国:

缓冲区中包含的任何指针都是指向此单个分配块中的位置的指针

在理想情况下,CredFree会在释放之前将整个区块归零,因此向Microsoft提交建议可能是值得的,但就目前情况而言,您最好的选择可能是在调用CredFree之前执行以下操作:

你拥有缓冲区。各国:

缓冲区中包含的任何指针都是指向此单个分配块中的位置的指针

在理想情况下,CredFree会在释放之前将整个区块归零,因此向Microsoft提交建议可能是值得的,但就目前情况而言,您最好的选择可能是在调用CredFree之前执行以下操作:


我运行调试器并在内存视图中看到CredentialBlob不是零输出或以其他方式馈送。这应该明确地执行,因为它可能包含敏感数据。我运行了调试器,并在内存视图中看到CredentialBlob不是零输出或以其他方式馈送的。这应该明确地执行,因为它可能包含敏感数据。
SecureZeroMemory (cred->CredentialBlob, cred->CredentialBlobSize);