1

我正在使用这样的Windows 凭据存储

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手动操作吗?谁拥有缓冲区?我发现没有其他源代码可以做到这一点......

我没有找到任何东西,https: //msdn.microsoft.com/library/aa919793.aspx 仅包含以下通用语句:

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

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

4

2 回答 2

2

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

你如何确定这一点?您很可能通过读取死内存来提交 UB。

an 仍然包含内存中的密码

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

于 2018-12-31T15:35:03.443 回答
2

您拥有缓冲区。该文档指出:

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

在一个理想的世界中,CredFree在释放它之前将整个块归零,并且可能值得向微软提交一个建议,但就目前情况而言,你最好的选择可能是在调用之前执行以下操作CredFree

SecureZeroMemory (cred->CredentialBlob, cred->CredentialBlobSize);
于 2019-01-01T00:31:01.230 回答