2017-10-19 146 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