2017-10-19 129 views
1

假如你有一個從原始字符串創建dont downvote my stupid question時間戳哈希如何工作?

現在我時間戳這個哈希像這樣一個現有的哈希g84t5tw73y487tb38wo4bq8o34q384o7nfw3q434hqa(在JS /僞代碼):

var hash = 'g84t5tw73y487tb38wo4bq8o34q384o7nfw3q434hqa'; 
var today= new Date(); // 2017-10-19 

var timestamped = hash + today; 

var new_hash = SHA256(timestamped); 

// new_hash is 34t346tf3847tr8qrot3r8q248rtbrq4brtqti4t 

如果我想驗證我的原始字符串我可以這樣做:

var verified = goodHash('dont downvote my stupid question',hash); // true 

如果我想驗證時間戳的版本,我可以這樣做:

var original_hash = 'g84t5tw73y487tb38wo4bq8o34q384o7nfw3q434hqa'; 
var today = '2017-10-19'; 
var verified = goodHash(original_hash+today, timestamped_hash); // true 

但是,如果我試圖驗證對時間戳原始字符串,我不能做:

​​

現在假設這個原始的字符串被散列和時間戳,一遍又一遍的重複n

我只能永遠能夠驗證n-1th時間戳,只要我有n-1th散列。

但是如果我有原始字符串dont downvote my stupid question並且想驗證任何ith時間戳,其中0 < i < n

基本上,我想驗證一個只有我應該知道的字符串是否使用了給定日期的時間戳,而不管它可能已被戳了多少次而不增加字符串的長度(太多 - 雖然任何增加的長度將接近無限,因爲n增長)。

這甚至可能嗎?哈希是否可以包含所有這些信息?

+0

我的直覺告訴我,你必須知道原始字符串和所有時間戳(直到第i個)來生成第i個散列。 –

回答

0

讓我們看看這裏所涉及的數學:

首先,你有一個輸入字符串s和時間戳的序列t。我將使用t[i]來表示ith時間戳。您的重複哈希是一種重複關係:

f(i) = hash(f(t[i-1]) + t[i]) 

其中+表示字符串連接。現在我們要確定是否有閉合公式F(x),它將計算ith散列,其時間複雜度低於評估遞歸關係f(i)

完成此操作的一種方法是找到與f(t[i-1]) + t[i]具有相同散列的字符串x(i)。對於一個好的散列算法,這些碰撞非常罕見。我的直覺是,找到這樣一個字符串(f(t[i-1]) + t[i]本身除外)比直接從遞歸關係直接計算更困難。

+0

問這個問題OP問的答案。 由於't [n]'和's'(其他時間戳t [i],其中0 pellucide