如何将SHA1返回值转换为ASCII

时间:2018-11-12 19:12:19

标签: c sha1 data-conversion

我试图创建用户输入的SHA1哈希并将其存储在字符串值中,以便可以将其与已知哈希的文本文件进行比较。

要创建哈希:

SHA1(password,strlen(password),temp);
print_hex(temp, sizeof(temp));

转换哈希:

for(i=0;i<sizeof(passHash);i++){
    sprintf(&passHash[i], "%02x", temp[i]);    
}
printf("%s\n", passHash);

Print_hex:

void print_hex(unsigned char *buf, int len){
    int i;
    for(i=0;i<len;i++){
        printf("%02x",buf[i]);
    }
    printf("\n");
}

当我使用已知的哈希密码(例如“ password”)运行程序时,它会使用print_hex显示正确的哈希值,但不会在sprintf之后显示。因此,我知道我错误地转换了SHA1哈希。

我在做什么错了?

1 个答案:

答案 0 :(得分:4)

您将在连续的sprintf调用中覆盖转换后的字符串。检查一下:

char passHash[100] = {0,};
for(i=0;i<sizeof(temp);i++){
    sprintf(passHash + i * 2, "%02x", temp[i]); // <-- each 2 bytes. e.g: 1 = 01, 255 = FF
}
printf("%s\n", passHash);

每个字节在十六进制字符串中占用2个字符,因此您需要将sprintf的目标缓冲区增加2。此外,temp是您正在读取的缓冲区,因此您的{{1} }循环应循环for,而不是sizeof(temp)

顺便说一句,这是一个示例代码,显示了您的错误,我并不是说这是最好的代码。