IPFS 原理与实践 (19):IPFS 底层基础 2.1.3

阅读数:5 2019 年 12 月 21 日 18:51

IPFS原理与实践(19):IPFS底层基础 2.1.3

(S/Kademlia DHT)

内容简介
这是一部从实现原理和工程实践两个维度深入讲解 IPFS 和 Filecoin 的著作。作者是中文社区内非常有影响力的三位 IPFS/Filecoin 布道者,本书得到了 IPFS&FileCoin 创始人以及 IPFS 官方(协议实验室)的高度认可和强烈推荐。
为 * 大化满足读者需求,书中不仅介绍 IPFS 技术细节、区块链相关知识、Filecoin 项目技术细节,还加入了大量作者们在开发中的经验和技巧。为了适配当下及未来较长时间内读者的实际使用环境,书中所有案例都是基于生态链中较新的软件开发工具和前沿的软件开发技术编写的。
本书分为三大部分:
第一部分 基础篇(第 1 章)
全面介绍了 IPFS 的源起,概念、优势和应用领域,旨在帮助读者了解 IPFS 相关基础背景知识,从宏观层面认识 IPFS 技术所具有的创新性。
第二部分 原理篇(第 2~5 章)
旨在帮助读者深入理解 IPFS 和 Filecoin 的运行原理与工作机制。首先深入分析了分布式哈希表、块交换协议、版本控制、自验证文件系统 Merkle DAG 和 Merkle Tree 等底层基础知识,然后对 IPFS 协议栈中包含的 7 层子协议了进行了剖析,接着解析了 Multi-Format、libp2p、IPLD 三大 IPFS 核心模块,最后用了一整章的篇幅详细剖析了 Filecoin 项目。
第三部分 实战篇(第 6~8 章)
以工程化的方式,从基础至进阶,介绍了 IPFS 技术的实际使用,包括安装、配置、交互、入网、API、内容发布、数据保存、私网搭建等内容,之后通过两个不同风格的实际项目案例向读者展示了基于不同语言所实现的 IPFS 协议栈的使用方法。

Kademlia 用于完全开放的 P2P 网络,如果不提供任何安全措施,它很容易受到来自恶意节点发动的各类攻击。由此 Ingmar Baumgart 和 Sebastian Mies 二人设计了一种更安全的 S/Kademlia(S/K)协议。基于 Kademlia 协议,S/K 协议在节点 ID 中加入隐式身份认证和兄弟广播(sibling Broadcast)。这样,S/K 就有能力抵御常见的日蚀攻击(eclipse attack)和女巫攻击(Sybil attack)了。

  1. Kademlia 面临的攻击

按照受到攻击的结构来看,攻击主要分为两类,第 1 类攻击是针对路由表控制网络中部分节点;第 2 类则是恶意消耗占用节点的资源。前者包括日蚀攻击、女巫攻击、流失攻击(Churn attack)和对抗路由攻击。

(1)日蚀攻击

如果一个节点在网络中能够自由选择它的 ID,攻击者可以在网络中安放一些恶意节点,使得信息都必须经由恶意节点传递。那么这样一来,恶意节点就能够在网络中将一个或几个节点从网络中隐藏掉。只要恶意节点不能自由选择 ID 或者很难通过策略修改其他节点的 K-Bucket,这一攻击就能避免了。我们从 2.1.1 节得知,KAD 会优先请求 K-Bucket 中的长时间在线的节点,一旦被攻击节点的 K-Bucket 是非满的,恶意节点就有机会加入攻击节点的 K-Bucket,那么攻击者只要拥有足够长的在线时间就能实现攻击了。

(2)女巫攻击

在开放的对等网络里,攻击者可以假冒多个 ID,用少数网络节点控制多个虚假身份。KAD 网络难以控制节点的数量,那么攻击者伪造大量虚假节点身份,就能控制部分网络。通常情况下可以通过消耗一定的系统和计算资源提高女巫攻击者的成本。当然,这也只能改善并不能杜绝。

(3)流失攻击

攻击者拥有网络的一些节点,即恶意节点,这可能会在网络中引发大量流量流失,从而导致网络稳定性降低。

(4)对抗路由攻击

恶意节点在收到查询指令后,不是按照 KAD 的要求返回距离 Key 最接近的网络节点,而是转移给同伙节点。同伙节点也做同样的操作,而不返回给查询节点所需要的信息,那么这样一来查询就会失效。我们发现,整个过程中必须将查询信息传递给恶意节点,这一攻击才能发动。那么我们可以在查询时,设计算法并行地查询,并且每一条查询路径不相交。这样一来,只要并行查询的路径中有一条不碰到恶意节点,查询就能成功了。

  1. S/K 防护方式

S/K 协议就是做出了上述的几个改进:为了避免日蚀攻击和女巫攻击,S/K 需要节点不能自由选择节点 ID,不能大批量生成 ID,同时不能窃取和伪装其他节点的 ID。这一方法可以通过非对称加密确保节点身份不被窃取,我们可以设置一定的计算量障碍,强迫节点进行一定的哈希运算来确保不能自由选择和批量生产 ID。

为了避免对抗路由攻击,我们需要并行查找不相交的路径。

(1)安全的节点分配策略

S/K 节点 ID 分配策略方案有 3 个要求:节点不能自由选择其 ID;不能生成多个 ID;不能伪装和窃取其他节点的 ID。

为了实现这些要求,S/K 设置了如下方法增加攻击的难度。每个节点在接入前必须解决两个密码学问题,静态问题是:产生一对公钥和私钥,并且将公钥做两次哈希运算后,具有 c1 个前导零。那么公钥的一次哈希值,就是这个节点的 NodeID。动态问题是:不断生成一个随机数 X,将 X 与 NodeID 求 XOR 后再求哈希,哈希值要求有 c2 个前导零。静态问题保证节点不再能自由选择节点 ID 了,而动态问题则提高了大量生成 ID 的成本。那么女巫攻击和日蚀攻击将难以进行。

为确保节点身份不被窃取,节点需要对发出的消息进行签名。考虑安全性,可以选择只对 IP 地址和端口进行弱签名;或者对整个消息进行签名,以保证消息的完整性。在其他节点接收到消息时,首先验证签名的合法性,然后检查节点 ID 是否满足上述两个难题的要求。我们发现,对于网络其他节点验证信息的合法性,它的时间复杂度仅有 (1);但是对于攻击者,为了生成这样一个合法的攻击信息,其时间复杂度是(2c1+2c2)。合理选取 c1 和 c2,就能有效避免这 3 种攻击方式了。

(2)不相交路径查找算法

在 KAD 协议中,我们进行一次查询时,会访问节点中的个 K-Bucket 中的节点,这个 K-Bucket 是距离我们需要查询的 Key 最近的。收到回复后,我们再进一步对返回的节点信息排序,选择前个节点继续迭代进行请求。很明显,这样做的缺点是,一旦返回的其他节点信息是一组恶意节点,那么这个查询很可能就会失败了。

为解决这个问题,S/K 提出的方案如下:每次查询选择 k 个节点,放入 d 个不同的 Bucket 中。这 d 个 Bucket 并行查找,Bucket 内部查找方式和 KAD 协议完全相同。这样一来,d 条查找路径就能做到不相交。对于任意一个 Bucket,有失效的可能,但是只要 d 个 Bucket 中有一条查询到了所需要的信息,这个过程就完成了。

通过不相交路径查找,能解决对抗路由攻击。S/K 协议将 Kademlia 协议改进后,针对常见的攻击,其安全性能大大提高了。

IPFS原理与实践(19):IPFS底层基础 2.1.3

购书地址 https://item.jd.com/12665074.html?dist=jd

评论

发布