2017-03-01 51 views
-1

對於那些在c更有經驗快速的問題...散列時間戳爲SHA256校驗和在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

'malloc'只有一個參數。發佈您實際使用的代碼。 – a3f

+2

你期望它有什麼價值? – interjay

+0

你認爲你有代碼打印256位值的位置? –

回答

3

由於obuf是一個數組,它的值打印導致它衰減到一個指針並打印存儲該數組的內存地址的值。編寫合理的代碼來打印一個256位的值。

也許是這樣的:

for (int i = 0; i < 32; ++i) 
    printf("%02X", obuf[i]); 
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,因爲它速度更快。

祝你好運。