获取二进制文件的哈希值

我想获取我的名字的二进制文件的哈希值。 我尝试了以下内容,但后来意识到SHA1()正在为字符串(文件名SHA1()返回哈希值。 但我想在文件本身上运行它。 关于如何做到这一点的任何指针都会很棒。

 char *fileName = "/bin/ls" unsigned char hash[SHA_DIGEST_LENGTH]; SHA1((unsigned char *)fileName, strlen(fileName),hash); 

感谢大家的评论,我解决了这个问题。 我在这里发布代码,所以其他人可能会发现它有益。

 void getFileHash(char *fileName){ unsigned char result[2*SHA_DIGEST_LENGTH]; unsigned char hash[SHA_DIGEST_LENGTH]; int i; FILE *f = fopen(fileName,"rb"); SHA_CTX mdContent; int bytes; unsigned char data[1024]; if(f == NULL){ printf("%s couldn't open file\n",fileName); exit(1); } SHA1_Init(&mdContent); while((bytes = fread(data, 1, 1024, f)) != 0){ SHA1_Update(&mdContent, data, bytes); } SHA1_Final(hash,&mdContent); for(i=0;i 

我不知道你的SHA1()函数是如何工作的(它来自libssl?),但我认为是

SHA1((unsigned char *)fileName, strlen(fileName),hash);

你是散列文件名,所以/bin/ls字符串。 您需要逐个字节地将文件内容读入缓冲区并对其进行哈希处理。

您需要按块读取文件块,并按块计算摘要块。

使用fread读取最多2048字节的块。 在开头使用SHA1_Init ,为每个块使用SHA1_Init在最后使用SHA1_Init

如果您在一个gulp中读取整个文件,则可以使用纯SHA1function,但不建议这样做。

另一种方法是对文件进行内存映射(请参阅mmap()或Windows等效的内容)并使用plain SHA1 。 这种方法非常有效,但比另一种方法更不便携。

您只需要将文件上下文的参数赋予SHA1()。 变量fileName包含字符串“/ bin / ls”,SHA1()函数返回该字符串的哈希值。 以下是如何读取文件和获取哈希的简单示例

  /* Used variables */ FILE *fp; char string[2048]; unsigned char hash[SHA_DIGEST_LENGTH]; int t; /* Open file */ fp=fopen("test","r"); if (fp == NULL) { printf("Can not open file\n"); exit(1); } /* Read file */ fread (string,1,sizeof(string),fp); /* Get hash of file */ SHA1((unsigned char *)string, strlen(string),hash); 

我希望字符串(2048)的缓冲区大小足以用于文件上下文。