c - 为什么 sha1 会为相同的输入字符串返回不同的哈希值?

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

}

最佳答案

您的 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

关于c - 为什么 sha1 会为相同的输入字符串返回不同的哈希值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26212600/

相关文章:

在c中将字符串元素转换为int数组元素

ruby-on-rails - 在 Ruby 中根据值从哈希集中选择一些哈希

memory - Redis 最佳哈希集条目大小

java - 如何在Java中比较sha1加密的密码?

ruby - 将 SHA1 密码转换为其二进制形式

c - 这个 C 宏中逗号的用途是什么?

c - sizeof 运算符的实现

c - isspace (ch & 0xff) 是什么意思?

java - 计算 SHA-256 哈希时前导零

perl Digest add addfile 计算不同的 SHA1 摘要