gpt4 book ai didi

c++ - CryptHashData 返回 ERROR_INVALID_PARAMETER (CAPI)

转载 作者:行者123 更新时间:2023-11-30 01:38:12 24 4
gpt4 key购买 nike

CryptHashData ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa380202(v=vs.85).aspx) 一直返回 FALSE。当我调用 GetLastError 时,我返回了一个 87 的值,它是常量 ERROR_INVALID_PARAMETER。我已经验证了我的参数(MSDN 注释说检查传入的指针)并且一切看起来都正常。我已将其尽可能靠近 MSDN 代码示例。

我的目标只是散列密码并从中派生 key 。

我在 Windows 10 上运行这段代码。

我的代码:

std::string sPassword = "123P@ssword"; //password to hash
HCRYPTHASH hHash = NULL; //password hash handle
HCRYPTPROV hHashKeyProvider = NULL; //provider to make the key derived from the hash
HCRYPTKEY hHashDerivedKey = NULL; //key derived from password hash

//get provider to the hash based password
if (!CryptAcquireContext(
&hHashKeyProvider,
0,
MS_ENHANCED_PROV,
PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT
))
{
throw std::runtime_error("Could not acquire context to make key from hash");
}

//create hash object from provider
if (!CryptCreateHash(
hHashKeyProvider,
CALG_SHA1,
0,
0,
&hHash
))
{
CryptReleaseContext(hHashKeyProvider, 0);
throw std::runtime_error("Could not create hash");
}

//get hash of password
//https://msdn.microsoft.com/en-us/library/windows/desktop/aa380202(v=vs.85).aspx
BYTE* pbPasswordBuffer = (BYTE*)sPassword.c_str();
DWORD dwPasswordBufferLength = strlen((char*)pbPasswordBuffer);
if (!CryptHashData(
hHashKeyProvider,
pbPasswordBuffer,
dwPasswordBufferLength,
0
))
{
CryptReleaseContext(hHashKeyProvider, 0);
DWORD dwLast = GetLastError(); //THIS EQUALS 87 for ERROR_INVALID_PARAMETER WHY???
throw std::runtime_error("Could not hash password");
}

//create key from hash
if (!CryptDeriveKey(
hHashKeyProvider,
CALG_AES_256,
hHash,
0,
&hHashDerivedKey
))
{
CryptDestroyHash(hHash);
CryptReleaseContext(hHashKeyProvider, 0);
throw std::runtime_error("Could not create key from password hash");
}

//free the hash
CryptDestroyHash(hHash);

建议?

最佳答案

注意,您不小心将 hHashKeyProvider 而不是 hHash 传递给了 CryptHashData()

此外,您的 GetLastError() 调用应该在 CryptReleaseContext() 之前进行,否则后者中的错误可能看起来像是来自 CryptHashData() 代替。

关于c++ - CryptHashData 返回 ERROR_INVALID_PARAMETER (CAPI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48431937/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com