我的 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(
您得到的结果是正确的。
我正在 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(
您得到的结果是正确的。