我正在开发一个项目,我有一个对象树。该对象树可能非常大,并且可能受到更多用户的非常频繁的修改(例如,添加或移除节点,改变节点的某些属性等)。现在,每次用户发布更新时,我都需要能够在用户修改树之后获取树的一些哈希值,以便用户可以使用其私有RSA密钥对更新进行签名。因此,我显然需要哈希加密安全。但是,每次用户只更改一个节点时,遍历整个树的线性表示是不可行的。
我考虑过这个策略,但我不确定这是否会成功:
现在,更新树应该很简单:每次更新节点时,我都会更改其父节点的哈希字段,然后更改祖父节点等等,直到达到根节点,并使用根的哈希值作为哈希值。这会将此操作的复杂性降低到O(ln(N))而不是O(N)。
然而,我知道相信自己对密码学的直觉是绝对安全的。这个程序安全吗?
答案 0 :(得分:2)
这称为hash tree or Merkle tree。这不是什么新鲜事,而且是安全的。它通常用于并行化散列,因为散列方法本身就是严格顺序的。
除非明确包含数据大小,否则不要连接数据和哈希值。最好只连接哈希值。
答案 1 :(得分:1)
在我看来,你的算法已经足够好了。
假设SHA-256是安全的(至少,它的名字是“安全哈希算法”),可以通过对树的深度的归纳证明你的算法也是安全的。