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

时间:2015-08-03 02:28:59

标签: c windows winapi hash sha

我在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调试会话的屏幕截图,显示了正在运行此函数时的当前变量值。

values

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

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

但结果哈希是

7804d488ccc172d87314474fb7f9951ec554cac33232bf2efc081afd323ca563

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

我做错了什么?

1 个答案:

答案 0 :(得分:4)

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

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

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

您获得的结果是正确的。