【问题标题】:Cryptographically hashing a tree of elements加密散列元素树
【发布时间】:2015-07-20 19:24:44
【问题描述】:

我正在做一个有对象树的项目。这个对象树可能非常大,并且可能会受到更多用户的非常频繁的修改(例如添加或删除节点,更改节点的某些属性等)。现在,每次用户发布更新时,我都需要能够在用户修改它之后获得树的一些哈希值,以便用户可以使用他的私有 RSA 密钥对更新进行签名。因此,我显然需要哈希是加密安全的。但是,每次用户只更改一个节点时,一遍又一遍地散列整个树的线性表示是不可行的。

我考虑过这个策略,但我不确定这是否会奏效:

  • 我向每个节点添加一个新字段,即其所有子节点的 SHA256 哈希。
  • 节点的哈希现在是节点的每个字段的哈希,因此包括其子节点的哈希。

现在,更新树应该很容易:每次更新节点时,我都会更改其父节点的哈希字段,然后是祖父节点,依此类推,直到到达根节点,并使用根节点的哈希值作为哈希值.这会将这个操作的复杂度降低到 O(ln(N)) 而不是 O(N)。

但是,我知道相信自己对密码学的直觉是不安全的。那么这个过程安全吗?

【问题讨论】:

  • 就您的解释而言,这似乎相当可靠。但是,您如何生成叶节点的哈希?节点之间是否足够“不同”,以至于它们的散列分布良好?例如,如果您的节点是 3D 坐标并且大多数点往往靠近原点,您可能会遇到分布充分的问题。另外,你如何组合叶节点哈希来形成父节点哈希?
  • 听起来您已经深入实施完全自定义的加密,这很可能以某种方式被破坏。为什么“很明显”你需要一个你要加密签名的东西的加密安全哈希?为什么散列树是“不可行的”?您确定要避免“长度扩展”问题吗?等等
  • @EricJ。我肯定要考虑如何散列叶节点。但是,每个节点都与其他节点完全不同。它们是从不重复的长字节序列。
  • 在这种情况下,这些字节的 SHA256 哈希就足够了。

标签: hash cryptography rsa sha256


【解决方案1】:

这称为hash tree or Merkle tree。这不是什么新鲜事,而且很安全。它通常用于并行化散列,因为散列方法本身本质上是严格顺序的。

除非您明确包含数据的大小,否则不要连接数据和散列。最好只连接散列。

【讨论】:

    【解决方案2】:

    在我看来你的算法已经足够好了。

    假设 SHA-256 是安全的(至少,它的名称是“安全哈希算法”),可以通过对树的深度进行归纳来证明您的算法也是安全的。

    【讨论】:

    • 我同意。数据就是数据。
    猜你喜欢
    • 2011-02-18
    • 1970-01-01
    • 2011-06-23
    • 2018-01-20
    • 1970-01-01
    • 2023-01-10
    • 2016-08-21
    • 2015-02-17
    • 2015-05-25
    相关资源
    最近更新 更多