获取二进制文件的哈希值C.

时间:2015-04-02 15:18:28

标签: c file sha1

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

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

4 个答案:

答案 0 :(得分:2)

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

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<SHA_DIGEST_LENGTH;i++){
    printf("%02x",hash[i]);
}
printf("\n");
/** if you want to see the plain text of the hash */
for(i=0; i < SHA_DIGEST_LENGTH;i++){
    sprintf((char *)&(result[i*2]), "%02x",hash[i]);
}

printf("%s\n",result);

fclose(f);
}

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

读取块,例如带fread的2048字节。在开头使用SHA1_Init,每个块使用SHA1_Update,最后使用SHA1_Final

如果您在一个gulp中读取整个文件,则可以使用普通SHA1功能,但不建议这样做。

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

答案 3 :(得分:0)

您只需要将文件上下文的参数赋予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)的缓冲区大小足以用于文件上下文。