我的 SHA256 哈希函数有什么问题?

What is wrong with my SHA256 hash function?

我正在 Windows 应用程序中编写此函数,该应用程序生成某些文本的 SHA-256 哈希值。代码编译并且 运行 没问题,但似乎产生了不正确的输出。

char GSalt[17] = { 0 };

HRESULT SaltHashAndStorePassword(_In_ char* PlainTextPassword)
{
    HCRYPTPROV CryptProvider = NULL;
    HCRYPTHASH HashPointer = NULL;

    char PlainTextPasswordWithSalt[64] = { 0 };

    strcat_s(PlainTextPasswordWithSalt, PlainTextPassword);
    strcat_s(PlainTextPasswordWithSalt, GSalt); 

    if (CryptAcquireContext(&CryptProvider, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT) == FALSE)
    {
        return(E_FAIL);
    }

    if (CryptCreateHash(CryptProvider, CALG_SHA_256, 0, 0, &HashPointer) == FALSE)
    {
        CryptReleaseContext(CryptProvider, 0);
        return(E_FAIL);
    }

    if (CryptHashData(HashPointer, (BYTE*)PlainTextPasswordWithSalt, (DWORD)strlen(PlainTextPasswordWithSalt), 0) == FALSE)
    {
        CryptDestroyHash(HashPointer);
        CryptReleaseContext(CryptProvider, 0);
        return(E_FAIL);
    }

    BYTE HashBytes[32] = { 0 };
    DWORD HashSize = 32;

    if (CryptGetHashParam(HashPointer, HP_HASHVAL, HashBytes, &HashSize, 0) == FALSE)
    {
        CryptDestroyHash(HashPointer);
        CryptReleaseContext(CryptProvider, 0);
        return(E_FAIL);
    }

    char *Hex = "0123456789abcdef";
    char HashString[65] = { 0 };

    for (int Count = 0; Count < 32; Count++)
    {
        HashString[Count * 2] = Hex[HashBytes[Count] >> 4];
        HashString[(Count * 2) + 1] = Hex[HashBytes[Count] & 0xF];
    }

    CryptDestroyHash(HashPointer);
    CryptReleaseContext(CryptProvider, 0);

    return(S_OK);
}

这是 Visual Studio 调试会话的屏幕截图,显示了此函数正在 运行 时的当前变量值。

如您所见,我正在尝试生成文本的 SHA-256 哈希

food@Jt/+iI?{?n\}L(

但是生成的散列结果为

7804d488ccc172d87314474fb7f9951ec554cac33232bf2efc081afd323ca563

根据我测试过的其他 SHA256 计算器,这是不正确的。

我做错了什么?

我刚刚检查过,Visual Studio 2013 调试器在字符串中将单反斜杠显示为双反斜杠。 (Visual Studio 2010 年没有。)

所以你实际散列的字符串是

food@Jt/+iI?{?n\}L(

您得到的结果是正确的。