【问题标题】:How to convert SHA1 return value to ascii如何将 SHA1 返回值转换为 ascii
【发布时间】:2018-11-12 19:12:19
【问题描述】:

我正在尝试创建用户输入的 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 哈希。

我做错了什么?

【问题讨论】:

  • passHash 是什么?如果是指针,sizeof(passHash) 可能不会给你你想要的。
  • 您永远不应该对用户密码进行 SHA1 处理。传统的加密哈希函数不适用于密码。相反,您应该使用基于密码的密钥派生函数,例如 bcrypt、scrypt、pbkdf2 或 argon2。 Here's why.
  • 你得到了什么?你能指望什么?你读过How to create a Minimal, Complete, and Verifiable example 吗?

标签: c sha1 data-conversion


【解决方案1】:

您将在连续的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 循环应该为 @ 循环987654326@,而不是sizeof(passHash)

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

【讨论】:

    猜你喜欢
    • 2021-01-20
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多