如何防止可能想要 alter/delete 我的 DHT 数据的恶意 DHT 客户端?

How do I prevent malicious DHT clients that might want to alter/delete my DHT data?

好吧,假设我有一个 DHT 运行 10 个客户端,里面有一堆数据。

恶意客户端 运行 我的程序的替代版本是否相对容易,这可能会对我的数据进行潜在的破坏性操作(例如替换密钥、删除密钥、更改数据,删除我的整个 DHT,等等...)

如何防止这种情况发生?

我只能想到:

有谁知道如何防止这种情况发生?提前致谢。

不要尝试验证软件 运行 DHT 节点本身,只需根据需要验证它们提供的行为和数据。

有多种方法可以做到这一点,具体取决于数据的预期用途。在不知道您的 DHT 的确切用例的情况下,我只能提供一些一般准则:

  • 如果您对 DHT 本身之外的数据有一些信任锚(例如,用户 A 给用户 B 一个包含公钥的 link),然后使用该签名,然后将其合并到您的协议设计中,例如从公钥中导出 DHT 查找密钥,用它来验证数据签名以防止伪造等。
    • 在某些情况下,使用椭圆曲线密码术并具有 node ID == node's pubkey
    • 可能很有用
  • 使用冗余,发布到多个节点。无论如何你都应该这样做,因为节点可以脱机/变得无法访问
  • 另一种形式的冗余:非对称 API,其中每个发起者发布单个值,但目标节点 return 已存储在其上的值列表,可能包含发起节点的 IP。
  • 减少激励 攻击者首先破坏 DHT:
    • 协作发布 - 如果网络中的多个参与者有兴趣发布相同的数据块,那么攻击者将更难与他们竞争
    • 易于重新生成数据 - 如果有人 dDoSes 密钥空间的一小部分,只需重新发布数据,发布者的任务是将内容保存在 DHT 中,不要依赖其他节点永远维护它
    • 间接/数据只是一个指针 - 如果 DHT 本身不包含任何 "juicy" 攻击者可能想要 delete/replace 的数据,而只是指向实际数据的指针,并且指针可以很容易地被另一个指针替换它变得不太有用来攻击它
    • 抗污染数据 - 20 个不良条目中的 1 个良好条目应该仍然有用)
    • 保持低复杂性 - 跨越多个 DHT 的脆弱数据结构nodes/indirected 查找比存储在数十个节点上的单个、几个字节长的字符串更容易被破坏
    • 提供一种稍后在更高协议级别验证数据的方法 - 将从 DHT 获得的所有内容都视为暂定的
  • 使攻击者很难控制除 DHT 密钥空间的一小部分以外的任何东西
    • 路由表中每个 IP 只有 1 个条目
    • <key,List<value>> 表中每个 IP 每个键只有 1 个条目
    • 通过使用 hashcash
    • 从节点的外部 IP and/or 派生它们来限制节点 ID
    • 使用 UDP 时:写入操作需要 3 次握手以避免 IP 欺骗

总的来说:将所有节点视为不可靠、有缺陷的节点以及其中一些(但不是全部)恶意节点。
信任但验证。