【发布时间】:2015-07-20 19:24:44
【问题描述】:
我正在做一个有对象树的项目。这个对象树可能非常大,并且可能会受到更多用户的非常频繁的修改(例如添加或删除节点,更改节点的某些属性等)。现在,每次用户发布更新时,我都需要能够在用户修改它之后获得树的一些哈希值,以便用户可以使用他的私有 RSA 密钥对更新进行签名。因此,我显然需要哈希是加密安全的。但是,每次用户只更改一个节点时,一遍又一遍地散列整个树的线性表示是不可行的。
我考虑过这个策略,但我不确定这是否会奏效:
- 我向每个节点添加一个新字段,即其所有子节点的 SHA256 哈希。
- 节点的哈希现在是节点的每个字段的哈希,因此包括其子节点的哈希。
现在,更新树应该很容易:每次更新节点时,我都会更改其父节点的哈希字段,然后是祖父节点,依此类推,直到到达根节点,并使用根节点的哈希值作为哈希值.这会将这个操作的复杂度降低到 O(ln(N)) 而不是 O(N)。
但是,我知道相信自己对密码学的直觉是不安全的。那么这个过程安全吗?
【问题讨论】:
-
就您的解释而言,这似乎相当可靠。但是,您如何生成叶节点的哈希?节点之间是否足够“不同”,以至于它们的散列分布良好?例如,如果您的节点是 3D 坐标并且大多数点往往靠近原点,您可能会遇到分布充分的问题。另外,你如何组合叶节点哈希来形成父节点哈希?
-
听起来您已经深入实施完全自定义的加密,这很可能以某种方式被破坏。为什么“很明显”你需要一个你要加密签名的东西的加密安全哈希?为什么散列树是“不可行的”?您确定要避免“长度扩展”问题吗?等等
-
@EricJ。我肯定要考虑如何散列叶节点。但是,每个节点都与其他节点完全不同。它们是从不重复的长字节序列。
-
在这种情况下,这些字节的 SHA256 哈希就足够了。
标签: hash cryptography rsa sha256