同一字符串有两个不同的哈希值

Арт*_*нов 2 c++ cryptoapi

我需要比较两个字符串的哈希值。我使用字符串“template”进行测试。但我得到了这个字符串的不同哈希值,所以它总是不一样。我使用 CryptoApi 和 MD4

int _tmain(int argc, _TCHAR* argv[])
{
    std::hash_map<int,int> table;
    HCRYPTPROV hProv1,hProv2;
    BYTE *pbBuffer1=(BYTE*)"template";//data to hash
    DWORD dwBufferLen1=strlen((char*)pbBuffer1)+1;
    HCRYPTHASH hHash1,hHash2;
    //first hash
    CryptAcquireContext(&hProv1,NULL,NULL,PROV_RSA_AES,0);
    CryptCreateHash(hProv1,CALG_MD4,0,0,&hHash1);
    CryptHashData(hHash1,pbBuffer1,dwBufferLen1,0);
    /*---------*/
    BYTE *pbBuffer2=(BYTE*)"template";//data to hash
    DWORD dwBufferLen2=strlen((char*)pbBuffer2)+1;
    //second hash
    CryptAcquireContext(&hProv2,NULL,NULL,PROV_RSA_AES,0);  
    CryptCreateHash(hProv2,CALG_MD4,0,0,&hHash2);
    CryptHashData(hHash2,pbBuffer2,dwBufferLen2,0);
    if (hHash1==hHash2)
        printf("The Same\n");
    else printf("Not same\n");
    /*---------*/
    std::cout<<hHash1<<std::endl;
    std::cout<<hHash2<<std::endl;
    if (hProv1)
        CryptReleaseContext(hProv1,0);
    if (hProv2)
        CryptReleaseContext(hProv2,0);
    system("pause");
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

例如hHash1中的哈希值

691136
Run Code Online (Sandbox Code Playgroud)

hHash2 中的哈希值

691216
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 5

HCRPTHASH是一个ULONG_PTRtypedef,按照这里。这意味着它是一个指针:

数据HCRYPTHASH类型用于表示哈希对象的句柄。这些句柄向 CSP 模块指示特定操作中正在使用哪个哈希。CSP 模块无法直接操作哈希值。相反,用户通过哈希句柄来操作哈希值。

typedef ULONG_PTR HCRYPTHASH;

比较指针与==将果冻(或美国公民的果冻)钉在树上或尝试训练猫一样有效:-)

您看到的“散列”值实际上是指针,相距 80 个字节(因为它们是指向两个不同内存块的指针)。

为了从句柄中获取实际的哈希值,您需要类似以下内容的内容,它会打印十六进制数字:

CHAR hexDigits[] = "0123456789abcdef";
BYTE md4Hash[MD4LEN];
DWORD cbHash = MD4LEN;
if (CryptGetHashParam (hHash1, HP_HASHVAL, md4Hash, &cbHash, 0)) {
    printf("MD4 hash is: ");
    for (DWORD i = 0; i < cbHash; i++) {
        printf ("%c%c", hexDigits[md4Hash[i] >> 4], hexDigits[md4Hash[i] & 0xf]);
    }
    printf("\n");
} else {
    DWORD dwStatus = GetLastError();
    printf ("CryptGetHashParam failed with code %d\n", dwStatus); 
}
Run Code Online (Sandbox Code Playgroud)

要比较两个哈希值,您可以执行以下操作:

BYTE md4Hash1[MD4LEN], md4Hash2[MD4LEN];
DWORD cbHash1 = MD4LEN, cbHash2 = MD4LEN;

CryptGetHashParam (hHash1, HP_HASHVAL, md4Hash1, &cbHash1, 0);
CryptGetHashParam (hHash2, HP_HASHVAL, md4Hash2, &cbHash2, 0);

if ((cbHash1 == cbHash2) &&
    (memcmp (md4Hash1, md4Hash2, cbHash1) == 0))
{
    // they are equal.
}
Run Code Online (Sandbox Code Playgroud)