为什么sha1为同一输入字符串返回不同的哈希值?

时间:2014-10-05 20:55:17

标签: c hash sha1

这是一个非常简单的程序,它接受一个整数并将其转换为字符串。从那里我使用SHA1散列字符串并将哈希打印到控制台。但是当我重新运行程序时,我得到了一个不同的哈希值,用于我程序中定义的相同整数。知道为什么会这样,我该怎么办?

这是我的计划。要编译我使用:gcc -o myhash myhash.c -lcrypto

int main (int argc, char* argv[]){

    //sha1 returns 20 byte hash
    unsigned char myHash[SHA_DIGEST_LENGTH];

    //my integer that I want to hash
    int myInt = -1613543;

    //convert to char string
    char input[50]; 
    snprintf(input,50,"%d",myInt);

    //compute hash
    SHA1(input,sizeof(input),myHash);

    //print hash
    int i;
    for(i=0;i<SHA_DIGEST_LENGTH;i++){

        printf("%02x", myHash[i]);
    }
    printf("\n");

    return 0;

}

1 个答案:

答案 0 :(得分:10)

您的SHA-1计算包括垃圾记忆。

char input[50]; 
snprintf(input,50,"%d",myInt);

这里初始化几个字节,由\0终止。但是尾随内存未初始化。您可以使用显式数组初始值设定项(char input[50] = { 0 };)或调用memset(input, 0, sizeof(input))来完成此操作。

//compute hash
SHA1(input,sizeof(input),myHash);

这里计算完整50字节输入的SHA-1哈希值。也许您想使用strlen(input)代替sizeof(input)

最后提示:使用已知的工作工具作为参考。例如:

$ echo -n -1613543 | sha1sum 
e3f0005827c95440fb6a9045b400d3b2d64001f8  -
$ echo -n -1613543 | openssl sha1
(stdin)= e3f0005827c95440fb6a9045b400d3b2d64001f8