Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c语言中将时间戳散列为sha256校验和_C - Fatal编程技术网

在c语言中将时间戳散列为sha256校验和

在c语言中将时间戳散列为sha256校验和,c,C,快速的问题,为那些更有经验的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)

快速的问题,为那些更有经验的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校验和的摘要形式(十六进制)

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

可能是这样的:

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

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

要在不将时间转换为字符串的情况下直接对二进制时间进行散列,可以使用(未测试)之类的方法:

这不处理字节顺序。您可以使用网络字节顺序函数,请参阅:

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

如果您愿意接受分辨率为秒的假设,并且不必担心代码会在20年内工作(请参阅:),那么您可以使用(未经测试):

#包括
时间(time)t cur(cur)time ;;
uint32净电流时间;//当前时间转换为网络字节顺序
charobuf[40];
gmtime(当前时间和当前时间);
净电流时间=htonl((uint32)电流时间);
SHA256(净电流时间、净电流时间、obuf);
我将重复我在评论中提到的内容:很难理解您希望从这个散列中获得什么,或者为什么不能直接使用时间戳。加密安全的散列(如SHA256)需要进行大量工作,以确保散列不可逆。您不能从中受益,因为输入数据来自有限的已知集合。至少,为什么不改用CRC32呢,因为它要快得多


祝你好运。

malloc
只接受一个参数。张贴您实际使用的代码。您希望它具有什么值?您认为哪里有打印256位值的代码?如果您确实需要散列时间戳,为什么还要麻烦将数字cur__________________________________?任何时间上的不一致都会给你带来麻烦。为什么不直接散列cur_时间呢?您可能需要说明的一件事是字节顺序,您不能允许您的哈希值根据机器体系结构进行更改。@vergessen您可能应该发布一个新问题。尽可能详细地描述您的用例和需求,并询问SHA256是否是一个好的解决方案,如果是的话,如何散列以及如何处理散列。
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
#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);