相同字符串的两个不同哈希值

时间:2012-01-06 13:26:57

标签: 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;
} 

例如hHash1中的哈希值

691136

hHash2中的哈希值

691216

3 个答案:

答案 0 :(得分:4)

根据{{​​3}},

HCRPTHASHULONG_PTR typedef。这意味着它是一个指针:

  

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); 
}

为了比较两个哈希值,你可以这样做:

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.
}

答案 1 :(得分:2)

答案 2 :(得分:1)

正如其他答案所指出的那样,hHash1hHash2是不透明的句柄 - 比较它们是没有意义的,因为它类似于比较具有相同值的两个不同对象的地址。

使用CryptGetHashParam获取哈希值并进行比较:

  

CryptGetHashParam函数检索管理哈希对象操作的数据。 可以使用此函数检索实际哈希值。