CryptHashData返回ERROR_INVALID_PARAMETER(CAPI)

时间:2018-01-24 21:31:57

标签: c++ hash

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

我的目标只是散列密码并从中获取密钥。

我在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);

建议?

2 个答案:

答案 0 :(得分:2)

if (!CryptHashData(
    hHashKeyProvider,

应该是

if (!CryptHashData(
    hHash,

答案 1 :(得分:2)

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

此外,您的GetLastError()来电应该在CryptReleaseContext()之前,否则后者的错误似乎来自CryptHashData()

相关问题