我正在这样使用Windows credentials store:
PCREDENTIAL cred = nullptr;
if (CredRead(entryName, 1, 0, &cred) != TRUE || !cred)
return -1;
// ... code which handles cred.UserName and cred.CredentialBlob
CredFree(cred);
如您所见,我将缓冲区释放为required。但是,我看到LPBYTE指针CredentialBlob
仍然有效,并且仍然在内存中包含密码。我是否必须手动SecureZeroMemory
?谁拥有缓冲区?我没有找到其他能做到这一点的源代码...
我什么都没找到,https://msdn.microsoft.com/library/aa919793.aspx仅包含以下通用语句:
使用后从内存中清除凭据数据
使用后不要将凭据保留在内存中。使用后,通过调用SecureZeroMemory清除临时存储区中的所有凭证数据。
答案 0 :(得分:2)
但是,我看到LPBYTE指针CredentialBlob仍然有效
您如何确定?您最有可能通过读取无效内存来提交UB。
一个仍然在内存中包含密码
这更令人担忧,但是您引用的文字告诉您如何处理。
答案 1 :(得分:2)
您拥有缓冲区。 documentation指出:
缓冲区中包含的任何指针都是指向此单个已分配块中位置的指针。
在理想情况下,CredFree
会在释放整个块之前将整个块归零,为此可能值得向Microsoft提出建议,但就目前情况而言,最好的选择是执行以下操作在致电CredFree
之前:
SecureZeroMemory (cred->CredentialBlob, cred->CredentialBlobSize);