我在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计算器,这是不正确的。
我做错了什么?
答案 0 :(得分:4)
我刚刚检查过,Visual Studio 2013调试器将单个反斜杠显示为字符串中的双反斜杠。 (Visual Studio 2010没有。)
所以你实际上是散列的字符串是
food@Jt/+iI?{?n\}L(
您获得的结果是正确的。