快速提问那些经验丰富的人...
我想使用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'。我在这里错过了什么?
答案 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,因为它的速度要快得多。
祝你好运。