c - 如何将 SHA1 返回值转换为 ascii

标签 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);

打印十六进制:

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 散列。

我做错了什么?

最佳答案

您在连续的 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 是您正在读取的缓冲区,所以你的 for 循环应该为 sizeof(temp) 循环,而不是 sizeof(passHash)

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

关于c - 如何将 SHA1 返回值转换为 ascii,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53268631/

相关文章:

.Net SHA1CryptoServiceProvider 与 SQL 哈希字节不匹配

c++ - 涉及转换函数的棘手情况?

powershell - 为什么 Powershell 文件串联会将 UTF8 转换为 UTF16?

sql-server-2008 - SSIS 包中的数据转换问题 - 文本到 GUID

c++ - 关于操作 native 数组的快速问题

c - c程序中用于无锁跳过列表实现的概率随机数

c - 在汇编器中将值从一个数组传递到另一个数组

c - 2个 child 写入管道, parent 从C中的管道读取

go - SHA1 encoding with secret,相当于PHP hash_hmac

sql - MS-SQL 中是否有等效于 SHA1() 的方法?