将时间戳记化为c

时间:2017-03-01 23:39:23

标签: c

快速提问那些经验丰富的人...

我想使用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校验和的摘要形式,以十六进制表示。

2 个答案:

答案 0 :(得分:3)

由于obuf是一个数组,因此打印其值会使其衰减为指针并打印存储数组的内存地址的值。写出合理的代码来打印256位值。

可能是这样的:

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

答案 1 :(得分:0)

这不是一个真正的答案,我只是与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,因为它的速度要快得多。

祝你好运。