【问题标题】:Hashing a timestamp into a sha256 checksum in c在c中将时间戳散列到sha256校验和中
【发布时间】:2017-07-21 12:27:07
【问题描述】:

对于那些更有经验的人的快速问题...

我想使用 openssl 中的函数计算当前操作发生时间的 SHA256 校验和。我的代码包括以下内容:

time_t cur_time = 0;
char t_ID[40];
char obuf[40];
char * timeBuf = malloc(sizeof(char) * 40 + 1);

sprintf(timeBuf, "%s", asctime(gmtime(&cur_time)));
SHA256(timeBuf, strlen(timeBuf), obuf);
sprintf(t_ID, "%02x", obuf);

然而,当我在调试语句中打印出 t_ID 的值时,它看起来像“de54b910”。我在这里想念什么?

  • 已编辑以修正我在 malloc 周围的拼写错误,并表示我希望看到 sha256 校验和的摘要形式,以十六进制表示。

【问题讨论】:

  • malloc 接受一个参数。发布您实际使用的代码。
  • 你期望它有什么价值?
  • 您认为哪里有代码可以打印 256 位值?
  • 如果您真的需要对时间戳进行哈希处理,为什么还要费心将数字 cur_time 转换为字符串? asctime 中的任何不一致都会给您带来问题。为什么不直接散列 cur_time 呢?您可能需要考虑的一件事是字节顺序,您不能让哈希值根据机器架构而改变。
  • @vergessen 您可能应该发布一个新问题。尽可能详细地描述您的用例和要求,并询问 SHA256 是否是一个好的解决方案,如果是的话,要散列什么以及如何处理散列。

标签: c


【解决方案1】:

由于obuf 是一个数组,打印它的值会导致它衰减到一个指针并打印存储数组的内存地址的值。编写合理的代码以打印 256 位值。

可能是这样的:

for (int i = 0; i < 32; ++i)
    printf("%02X", obuf[i]);

【讨论】:

    【解决方案2】:

    这并不是真正的答案,我只是与 OP 共享一个代码片段。

    要直接散列二进制 time_t 而不将时间转换为字符串,您可以使用类似(未经测试):

    time_t cur_time;
    char t_ID[40];
    char obuf[40];
    
    gmtime(&cur_time);
    SHA256(&cur_time, sizeof(cur_time), obuf);
    
    // You know this doesn't work:
    // sprintf(t_ID, "%02x", obuf);
    
    // Instead see https://stackoverflow.com/questions/6357031/how-do-you-convert-buffer-byte-array-to-hex-string-in-c
    

    How do you convert buffer (byte array) to hex string in C?

    这不解决字节顺序。您可以使用网络字节顺序功能,请参阅:

    htons() function in socket programing http://beej.us/guide/bgnet/output/html/multipage/htonsman.html

    一个复杂的问题:time_t 的大小没有指定,它可能因平台而异。它传统上是 32 位,但在 64 位机器上它可以是 64 位。它通常也是自 1970 年 1 月 1 日午夜 Unix epoc 以来的秒数。

    如果您愿意接受分辨率为秒的假设,并且不必担心代码在 20 年内有效(请参阅:https://en.wikipedia.org/wiki/Year_2038_problem),那么您可以使用(未​​经测试):

    #include <netinet/in.h>
    
    time_t cur_time;
    uint32_t net_cur_time; // cur_time converted to network byte order
    char obuf[40];
    
    gmtime(&cur_time);
    net_cur_time = htonl((uint32_t)cur_time);
    SHA256(&net_cur_time, sizeof(net_cur_time), obuf);
    

    我将重复我在评论中提到的内容:很难理解你可能希望从这个哈希中获得什么,或者为什么你不能直接使用时间戳。 SHA256 等加密安全散列经过大量工作以确保散列不可逆。您无法从中受益,因为输入数据来自有限的已知集合。至少,为什么不使用 CRC32,因为它更快。

    祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多