从命令行SHA1()vs shasum

时间:2014-10-29 03:12:45

标签: c hash sha1 sha

所以我一直在玩SHA哈希,但是我遇到了一些障碍。出于某种原因,命令行中的shasum和程序中openssl的SHA1()会产生两个不同的结果。

代码:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <openssl/sha.h>

int main(int argc, char* argv[]){
  int i;
  char data[] = "README";
  size_t length = sizeof(data);
  unsigned char hash[50];

  SHA1(data, length, hash);

  printf("shasum of \"README\" is \n");
  for(i = 0; i<SHA_DIGEST_LENGTH; i++){
    printf("%x", hash[i]);
  }
  printf("\n");

  /*Using shasum utility*/

  int rc = fork();
  if(rc < 0){
    fprintf(stderr, "Fork failed. \n");
    exit(1);
  }
  else if(rc == 0){
    char* myargs[3];
    myargs[0] = strdup("shasum");
    myargs[1] = strdup("README");
    myargs[2] = NULL;
    execvp(myargs[0], myargs);
  }
  wait(NULL);

  return 0;
}

输出:

shasum of "README" is
aabc5996b4a0256158cbaa6eb4e01b3aa992d942
827cc372e1a3c99b66f6ad820b223939c68bd389  README

第一个散列来自SHA1,第二个散列来自shasum(来自程序内的fork / exec)。造成这种情况的原因是什么?

1 个答案:

答案 0 :(得分:3)

问题是命令行函数“shasum”将文件名作为参数,而openssl-library C函数“shasum”将实际数据作为参数。

也就是说,您正在将名为README的文件的散列结果与字符串“README”的散列结果进行比较。

要查看两个计算结果相同,只需更改:

SHA1(data, length, hash);

SHA1(data, length-1, hash);

正如Jonathan Leffler所说,这是为了纠正你包括终止'\ 0'的事实。

对于其他计算,您可以echo -n README | shasum查看真实哈希值。或者,要在程序中看到结果正常,只需将其输出到名为README的文件:echo -n README > README

然后您的程序将输出:

shasum of "README" is 
69e27356ef629022720d868ab0c0e3394775b6c1
69e27356ef629022720d868ab0c0e3394775b6c1  README

编辑:

如果要使用SHA1函数计算自述文件的哈希值,则必须读取该文件(请参阅您需要以编程方式将文件读取到char *缓冲区,(参见Reading the whole text file into a char array in C )并将此缓冲区传递给SHA1函数。