【问题标题】:BLAKE2 input parametersBLAKE2 输入参数
【发布时间】:2015-05-03 00:34:28
【问题描述】:

作为一个新手,我正在阅读有关最近一批哈希函数的论文,BLAKE2 引起了我的兴趣。然后我想玩一下代码包中的“blake2s”代码。

如果我要实现一个简单的字符串哈希,我可以理解键和盐的内置变量。

但我不知道如何提供字符串或文件作为输入并收集哈希作为输入。哪些变量负责消息和摘要?

也许我做错了,但以下内容没有打印任何输出。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "blake2s.h"
#include "blake2s.c"

#define SIZE 1024

int main(){
    unsigned char *str, *hash;
    str = malloc(SIZE * sizeof *str);
    hash = malloc(32 * sizeof *str);
    printf("> ");
    scanf("%s", str);
    int a = blake2s(hash, str, NULL, 32, 1024, 0);
    if(a)
        printf("%s", hash);
    return 0;
}

【问题讨论】:

  • 糟糕。如果我现在要给它加盐,那么我需要从 /dev/(u)random 管道输送盐吗?
  • 我认为使用 salt 功能没有多大意义,而且 AFAIK 参考实现并没有公开它。第三个参数是键,你想用什么作为键取决于你在做什么。它与 HMAC 或 HKDF 的密钥几乎相同。
  • 请注意,scanf("%s", str) 最多只能读取第一个空格(空格、制表符、换行符)。打印您读取的数据通常是一个好主意,这样您就知道程序得到了您认为的数据。如果您在程序中键入单词,则只会对第一个单词进行哈希处理。或者,更糟糕的是,如果 blake2s() 的 1024 参数说“有 1024 个字节的数据要散列”,那么您将不确定的数据传递给函数,因为 malloc() 没有义务将分配的内存设置为任何特定值。

标签: c hash cryptography


【解决方案1】:

您的程序有两个与打印哈希直接相关的问题:

  1. 返回0 表示成功。所以你的if 需要替换为类似

    if(a==0)
         printf("%s", hashStr);
    else
         printf("error %d", a);
    
  2. 哈希是原始二进制,甚至可以包含\0 字节。您应该在打印之前应用十六进制或 Base64 编码。

还有一些其他错误和风格问题:

  1. 您可能想用strlen(str) 替换传递给散列器的1024,因此它只散列实际字符串。

  2. 如果用户输入超过 1024 个字节,您的程序就会出现缓冲区溢出。在测试程序中没有什么大问题,但是你应该在适当的实现中修复一些问题,因为它会是一个安全漏洞。

  3. sizeof(char) == 1 定义

【讨论】:

    猜你喜欢
    • 2016-05-28
    • 2021-12-22
    • 1970-01-01
    • 2013-01-03
    • 2010-10-21
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多