所以我一直在玩沙哈辛,但我碰到了一堵墙。出于某种原因,在我的程序中,来自命令行的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)。这是什么原因?
最佳答案
问题是命令行函数“shasum”将文件名作为参数,而openssl库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函数。
关于c - 命令行中的SHA1()vs shasum,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26622185/