c-为什么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;
}

您的SHA-1计算包括垃圾内存。

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

在这里,您在开始时初始化几个字节,以结束。但是尾部内存没有初始化。可以通过使用显式数组初始值设定项(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

最新更新