# 区块链安全实战

By [leaf](https://paragraph.com/@leaf-6) · 2022-11-21

---

在过去的两年里，由于WannaCry、NotPetya和Locky的出现，勒索软件吸引了大量的媒体报道。2017年5月，WannaCry勒索软件在全球多个系统中迅速传播。它攻击了几个知名组织，包括英国国民健康服务、西班牙电话公司Telefonica、法国汽车品牌雷诺（Renault）、美国物流公司联邦快递（FedEx）、日本公司日立以及很多其他的大型企业。

勒索软件的作者通过暗网托管服务，允许任何买家创建和改进恶意软件。

暗网是因特网的一部分，它无法通过普通的搜索引擎进入，需要一种特殊类型的匿名浏览器Tor去登录。换句话说，暗网包含普通搜索引擎无法获得的无索引数据。Tor浏览器基本上通过一系列代理服务器来路由用户信息，这使得用户身份无法识别且无法追踪。暗网看起来与普通网站类似，但命名结构存在一些差异。暗网没有如.com、.net或.co的顶级域名（TLD）。相反，它们只使用以.onion结尾的域名网站。

1.黑客货币化

根据网络安全业务报告，预计到2019年，勒索软件的损失成本将达到115亿美元。在全球范围内存在一些驱动因素使得勒索软件业务持续增长。为了更快地获得收益，网络犯罪分子已经不再自主编制恶意软件了，而是利用勒索软件即服务（RaaS）来实现他们的需求，这种服务可以在暗网市场上获得。

这些市场不仅可以让犯罪专家花费更少的精力制造勒索软件，而且还允许非技术型犯罪分子或程序员使用脚本进行勒索软件操作。

攻击者使用预先配置的计时器生成勒索软件程序，如果在截止时间前未支付赎金，那数据就会被销毁。攻击者还共享了一个支付程序，该支付程序主要通过比特币钱包进行交易（因为数字加密钱包提供匿名功能）。

2.WannaCry

WannaCry攻击是2017年5月12日发生的最大规模勒索软件攻击事件。WannaCry利用了Windows操作系统中的漏洞，该漏洞首先由NSA发现，然后通过Shadow Brokers公开出来。它旨在探索Windows SMBv1和SMBv2中的漏洞，以便在网络中横向传播。截至2017年5月24日，该勒索软件已在150个国家和地区感染了超过20万台计算机系统。

3.NotPetya

NotPetya是另一种攻击风格的勒索软件，于2017年6月推出。NotPetya勒索软件在几个方面明显类似于Petya病毒——它加密文件并显示一个窗口来要求支付比特币以恢复文件。最初的感染方式是从M.E.Doc的后端程序植入。通过M.E.Doc软件感染系统后，NotPetya使用EternalBlue和EternalRomance等工具在网络中传播。它还尝试利用名为Mimi Katz的工具在受感染的计算机中查找管理凭据。

4.SimpleLocker

SimpleLocker是第一个不感染任何计算机系统的勒索软件攻击，但其针对了几种智能移动设备。黑客首先选择的目标移动系统是Android，这种勒索软件的源头一度被追踪到了东欧。木马程序的攻击目标是插入到平板电脑和手机中的SD卡，它会自动抓取整套系统以获取某些文件，然后要求支付现金来解密相应数据。该病毒通过谷歌应用商店（Google Play Store）进入设备。一旦安装后，病毒会扫描受影响的设备以查找各种文件类型，并使用AES加密算法对其进行加密，将文件扩展名更改为.enc。它还用于从相应设备收集各种其他信息，例如IMEI号、设备型号和制造商，并将其发送到黑客远程控制的服务器。黑客利用这种病毒的最新版本甚至可以访问设备摄像头并显示受害者的照片，恐吓他们支付赎金。该种木马软件的威胁至今仍然潜伏在我们身边。

5.TeslaCrypt

在CryptoLocker之后的一年内，又出现了一种新威胁，即TeslaCrypt。一开始，许多人认为它是CryptoLocker的另一种形式，但是后来它被赋予了一个新的名称——TeslaCrypt。这个勒索软件针对的是一群和以往不同的人——骨灰级玩家。TeslaCrypt针对并影响了与视频游戏相关联的辅助文件。这些辅助文件包含保存的游戏文件、地图、任何与游戏相关的可下载内容等。这种勒索软件的独特之处在于，软件作者不断改进Trojan木马，并在攻击持续进行时，修复所有的漏洞。

6.CryptoLocker

CryptoLocker是一种大规模的勒索软件，于2013年9月5日首次在因特网上发布，通过电子邮件附件和Gameover Zeus僵尸网络进行传播。它会对运行Microsoft Windows系统的设备产生影响，并通过恶意电子邮件附件持续传播，并使用RSA加密算法加密存储在用户本地和网络驱动器上的某些类型的文件。CryptoLocker于2014年5月后期通过Tovar操作被移除，因其使Gameover Zeus僵尸网络瘫痪。据报道，CryptoLocker已成功向受害者勒索了300多万美元。

7.PC Cyborg

1989年出现了一个名为PC Cyborg的木马，它具有隐藏文件夹和加密C盘中文件名的能力。导致受害者不得不向PC Cyborg公司支付189美元。

Forrester最初提出的一种被广泛接受的方法是以数据为中心的，这种方法被用来实现对所有的数据和资源进行始终验证。它最初旨在解决扁平网络的问题，后来用于帮助威胁行动者在不被察觉的情况下通过内网漫游，窃取敏感和机密的信息。这种方法同样允许安全专业人员重新获得对网络和应用的控制权。接下来我们开始研究零信任法：

1）识别敏感数据并分类：为了保护你的数据，首先需要查看并了解数据。如果你不了解自己的敏感数据，在感染后情况可能变得更糟。一旦识别出了敏感信息，你就有必要对它进行分类。

2）绘制数据流图：对网络中的应用流有一个高水平的了解是很重要的。除此之外，与利益相关者进行合作是件好事，他们包括网络团队、应用团队和安全工程师，可以和他们一起利用现有模型准备最终的数据流。

3）建立网络架构：零信任的设计展示了多个网络之间的通信流程，并说明了用户该如何访问外部数据。在这种情况下，一个机构可以利用物理和虚拟的交换机配置确认微边界。

4）构建政策基础：这种方法的一个关键点是，安全专家应该在须知原则的基础上限制用户访问，并实行有效的访问控制。除了洞悉IP头字段之外，安全团队还需要了解用户身份以及应用程序行为。

5）持续监测：你应该实时收集和检查整个网络和应用程序的日志，不仅包括外部网络的流量，还包括来自专用网的流量。内部流量的处理方式应与外部流量的处理方式相同。

访问[https://www.forrester.com/search?N=21061+10001sort=3everything=truesource=browse了解零信任方法。](https://www.forrester.com/search?N=21061+10001sort=3everything=truesource=browse%E4%BA%86%E8%A7%A3%E9%9B%B6%E4%BF%A1%E4%BB%BB%E6%96%B9%E6%B3%95%E3%80%82)

·访问[https://hbr.org/2017/01/the-truth-about-blockchain了解TCP/IP和区块链。](https://hbr.org/2017/01/the-truth-about-blockchain%E4%BA%86%E8%A7%A3TCP/IP%E5%92%8C%E5%8C%BA%E5%9D%97%E9%93%BE%E3%80%82)

2009年，中本聪发表了名为《比特币：一个对等电子现金系统》的白皮书，旨在应对金融市场中存在的挑战。该白皮书致力于开发一个允许一方到另一方的在线支付，却无须通过金融机构中介的平台。比特币解决的一个主要问题是关于双花的，它可以避免比特币的二次消费（数字货币的一个独特问题是，如何避免用户在花掉了某些币值后，还能重复使用这些币）。由于比特币是数字货币，复制且公布数字化数据并不困难，所以会出现重复消费问题（即双花问题）。预防这种情况的解决方案出现了——那就是区块链。然而，中本聪的原始文章没有提到区块链这个词而是以区块的链形式出现在比特币源代码的注释中。

区块链是一个分散的数据库，它保证所有交易记录的安全性，并且以添加的方式记录。由于其数据库的分散性，区块链在众多行业中迅速流行开来。对一个无法容忍一点失败的组织来说，区块链数据库使得敏感信息实际上不可能被网络罪犯所破坏。此外，区块链不仅仅由可信的管理员或者开发人员管理，任何可以信任或来自已知或未知方的人员，都可以进行良好的管理。下面是区块链网络的图形表示：

每个连接到网络上的计算机都需要有区块链节点的软件，并且运行针对区块链生态系统的应用程序。根据使用情况，这些计算机的参与可能会受到限制。例如，基于区块链的银行链生态系统只允许银行节点运行银行链的客户端应用程序。

因特网是一项具有30多年历史的技术，其目的是通过TCP/IP和开放系统互连（OSI）模型栈共享信息。从因特网诞生开始，无论是电子邮件还是Web，甚至是电子商务，每一项新技术都颠覆了现有技术。因特网是最强大的技术之一，其功能已强大，可以传播思想并创造虚拟世界。

TCP/IP是第一个构建标准化相似网络之间通信的因特网协议簇。而OSI模型是由国际标准化组织（ISO）开发的，以提供标准化系统之间通信的框架，而不用考虑供应商、模型或者技术。由于客户端/服务器网络在本质上更加可靠和稳定，所以各类组织机构更喜欢基于客户端/服务器通信的两种模型。重要的是，客户使用的数据以及他们使用数据的方式需要得到更好的控制。在客户端/服务器模型中，客户端管理自己的本地资源，例如工作站或任何设备的硬件和软件组件，而服务器是管理共享资源（例如硬件、网络通信通道和数据库）的功能系统。在对等网络中，没有监控、控制和执行命令的中央系统。尽管过去出于内部需要，小企业更喜欢使用这种方式，但大型机构总是避免对等网络，因为使用它会有失去对其业务操作和管理的控制的风险。

然而，在连接整个世界的过程中，有一些时刻重新定义了创新，并为每个企业的需要提供了媒介。区块链，一个由独立节点组成的对等网络，能在没有任何第三方参与的情况下共享任何类型的数值。计算机的发展首先从大型计算机开始，十年后，因特网出现了。云计算由Ramnath Chellappa教授在1997年定义，Amazon在2006年推出了弹性计算云（EC2）服务。我们现在正处在一个新的时代，数据安全存储的方式在不断改变。

因特网上所做的一切都是通过TCP/IP模型的IP包来完成的。IP包是可以通过因特网发送的最小数据单元，具有IP报头和有效载荷两个部分。

为了发送这些信息，它需要一个源IP地址和一个目的IP地址。区块是这个过程的必需元素，它被链接在一起形成区块链。区块由区块头和区块体组成。为了发送任何类型的值或完成任何类型的交易，它添加自己的数字签名作为源标识符和公钥，这与对等网络中的目的地身份相似。

Web应用是一个基于网络的应用程序，它广泛地应用于客户端/服务器模型中以服务用户。然而，去中心应用（dApp）是在对等计算机网络上运行的应用程序。

传统的Web应用使用CSS、HTML和JavaScript来渲染前端页面，通过API调用从数据库中获取数据。去中心应用的前端使用完全相同的技术来呈现页面，但其使用连接到区块链的智能合约取代了API的调用。

区块链账本的运作方式。为了理解系统的通用形式，重要的是了解链的多个状态并进行进一步的探索。

1）交易准备：在这个阶段，A方创建一个交易，内容包括接收方的公共地址、源数字签名和交易信息。现在，这个交易可被区块链中的所有节点获得。

2）交易验证：区块链的节点工作在去信任模型中，其中每个节点（运行区块链客户端软件的机器）接收该交易信息，并用A方的公钥验证数字签名。成功验证之后，这个经过身份验证的交易信息被放置在账本队列中，然后等待至所有节点成功验证该交易为止。

3）区块生成：队列中的交易被安放在一起，网络中的一个节点创建区块。在比特币区块链中，当比特币节点（也称为矿工节点）通过解决一些复杂的数学问题创建了区块，就会获得比特币奖励。

4）区块校验：在成功地生成区块后，网络中的节点为了迭代校验的过程会被处理，其中大多数节点需要达成共识机制。一般有四种常用的共识算法：工作量证明（PoW）、权益证明（PoS）、授权权益证明（DPoS）、实用拜占庭容错（PBFT）等。比特币使用PoW达成共识，以太坊使用PoS来达成共识。这种机制在金融领域起了很大的作用，能确保整个交易操作的安全性。

5）区块链接：在成功达成共识之后，验证区块并将其添加到区块链中。可以在下面的图中了解区块链的几种状态：

![](https://storage.googleapis.com/papyrus_images/8ec1d36764253f3e20b563d209aa9be8c88457bc3bbe40aeb6a4f3be78b76542.png)

比特币的世界状态数据存储于chainstate目录，采用LevelDB进行管理，主要存储当前还没有花费的所有交易输出以及交易的元数据信息，用来验证新传入的交易和块，存储这些数据的时候会做适当的压缩。LevelDB是一个可持久化的键值数据库，利用磁盘顺序写性能比随机写大很多的特性，采用LSM-Tree结构，将磁盘的随机写转化为顺序写，大大提高了写速度。LSM将树结构拆成一大一小两棵树，较小的一个常驻内存，较大的一个持久化到磁盘。写入操作会首先操作内存中的树，随着内存中树的不断变大，会触发与磁盘中树的归并操作，而归并操作本身仅有顺序写。Bitcoin的LevelDB存储了多种数据，其中最主要的为Coin数据，以的方式存储，Key是CoinEntry类型，由三部分组成：

1字节的大写字符“C”(DB\_COIN)，32字节的交易ID值以及4字节的序列号;Value为Coin对象序列化后的值。

![](https://storage.googleapis.com/papyrus_images/bf47db415fd296bc875ef1877d73b1e90df7b3cd634998b53f2957d69ae8279c.png)

以太坊的世界状态处理
==========

世界状态是通过网络中全局的未使用交易输出(UTXO)来描述的，而以太坊则利用账户概念来描述状态信息。账户状态包含四个属性，nonce，balance，storageRoot和codeHash。以太坊用stateObject来管理账户状态，账户以Address为唯一标示，其信息在相关交易的执行中被修改。所有账户对象逐一插入Merkle-PatricaTrie(MPT)结构里，形成stateTrie。区块头数据结构中的Root字段存储了stateTrie的root数值，即世界状态的哈希值。

![](https://storage.googleapis.com/papyrus_images/8b74a31949bd0b963839a57c7992f3ce3865b3e612e1440c05db4212acf9eacd.png)

区块链技术是建立在一组已经广泛应用于整个行业的现有技术之上的。让我们了解区块链的每个组成部分，它们使整个系统在本质上具有分布式的、不可篡改的、可信任的特点。

共识机制是区块链系统的一个组成部分，负责在分布式环境中达成一致协议。区块链环境的开放性和去信任化是区块链的核心特性，但是，额外的关注和严格的过程也很重要。因为任何人都可以参与和提交信息，所以评估每个参与者的目的至关重要，并且使每个人都采纳用于避免欺诈企图的政策。由此产生了共识机制，类似于信号处理，以确保在实际通信开始之前已经考虑了所有问题。下面是与区块链达成共识的四个关键方法：

·PoW：比特币的创始人中本聪发明了一种方法来实现区块链的共识机制。在这种类型的共识中，通过相信那些完成了最大的可验证计算工作量的节点，可以实现对欺诈的防范。区块创建者，在数字货币的世界中也被称为矿工，深知拥有强大的计算能力可以获得更好的哈希率，进而挖矿成功并且获得比特币奖励的机会也会增加。每个新的交易被广播到网络中的所有节点，并且每个节点持续监听所有交易。想要在比特币系统获得奖励的节点被称为矿工，它们不只是倾听，而且还收集交易。矿工必须用PoW算法解决一些复杂的数学问题。首先解决每个问题的矿工会得到比特币奖励。最后，验证的区块会被添加到每个矿工的区块链中。

这个数学问题是将哈希应用于一组交易和一个现时值（一个32位随机数）来实现所需哈希输出结果的过程。如果输出的哈希值小于目标哈希值，则矿工将赢得区块并实现共识机制。当矿工赢得区块时，每个区块自带一些比特币（BTC），然后矿工会收到：

·2009年1月—2012年11月：每个区块50个BTC。

·2012年11月—2016年7月：每个区块25个BTC。

2016年7月—2020年2月：每个区块12.5个BTC。

·2020年2月20日—2023年9月：每个区块6.25个BTC。

·PoS：这是在节点之间的区块链中达成共识并校验交易的另一种方法。与PoW不同的是，PoS区块生成器不会根据其当前的堆栈来选择。在这个机制中，不会奖励区块，PoS中的矿工被称为锻工。以太坊使用PoS，选择它的目的是避免任何伴随大量电力消耗而产生的环境压力。根据数字经济学家2017年的报告，整个比特币网络一年所消耗的电力估计比爱尔兰共和国一年消耗的还要多。比特币使用PoW机制，并且全部都依赖于资源强大的矿工，这导致了更多的电力消耗。使用PoS机制，节点必须加入校验池以便被选中为锻工。Casper作为以太坊共识PoS协议，是一个扩展现有PoW机制的混合版共识机制，用于以太坊运行每一百个区块中的最后一个。PoS非常适合固定币供应量的平台，人们可以用它来进行代币分发而非投资。

·DPoS：这是另一种共识协议，并被认为是一种更快更有效的模型。DPoS使用民主的方式来解决共识问题。在网络中选择区块生成器并且确认交易大约需要一秒钟。这样，你不仅解决了共识问题，而且消除了不必要的监管干扰。

·PBFT：拜占庭故障是指故障检测系统同时出现故障和正常工作的状态，对不同的检测器显示不同的模式。如果一些节点成员向其他节点发送关于交易的不一致的信息，那么可能导致整个网络发生错误。PBFT是一种保护网络免受拜占庭故障的解决方案。

以太坊（Ethereum）是最成熟的区块链之一，向平台提供了自定义区块链系统的方法。比特币的目的在于用它自己的共识机制来瓦解当前的支付系统和网上银行，而以太坊目前正处于对现有计算机系统进行去中心化的过程中，因为它在客户端/服务器模型上运行得很好。

以太坊是一个分散的网络，能够在分布式环境中运行应用程序。这个想法只是为了避免完全依赖单个实体来存储和管理用户的个人和业务数据。在当前的数据库系统中，一旦数据在线存储，客户端就无法得知数据如何存储、已经采取了哪些安全防范措施、谁可以读取数据等信息。以太坊提供了一个平台来构建分布式应用程序，这些应用程序直接连接每个堆栈持有者或某一方，以实现更好的透明度和零依赖性。即使比特币和以太坊之间存在基本相似之处，它们在用途和功能上都存在显著差异。随着以太坊的使用，任何集中式服务都可以通过其独特的编程能力转换为分散式服务。

以太坊主要有三层——以太坊虚拟机（EVM）、加密货币以及gas（以太和油费或能源）。

智能合约是由其创建者编写以执行特定任务的程序。尽管合约可以在任何区块链版本上进行编码，但是以太坊是最受欢迎的，因为它提供了可扩展的处理能力。

以太坊允许开发者为自己的智能合约进行编码。智能合约可以用来：

·当特定事件发生时，通过自动触发索赔来简化索赔结算流程。

·管理用户之间的协议。

·存储有关应用程序的信息，如健康记录和KYC信息。

在以太坊中，每个合约都有一个地址用以唯一标识它。此地址由哈希创建者的地址和已执行的交易数量来计算。

在将智能合约部署到公共区块链环境中时，我们将得到智能合约的地址。现在，我们可以编写代码来与智能合约中的特定实例进行交互。合约具有若干标准，如ERC20标准，而其实现所需的方法也很重要。

让我们尝试建立第一份智能合约。我们将使用Solidity语言来编写智能合约。编程语言Solidity类似于JavaScript。要开始这个过程，我们首先必须使用Ganache包来设置环境，该包将用于创建一个私有区块链。我们需要在线访问MyEtherWallet，可以在地址[https://github.com/kvhnuke/etherwallet/releases找到。](https://github.com/kvhnuke/etherwallet/releases%E6%89%BE%E5%88%B0%E3%80%82)

一旦安装了软件包，我们访问[https://remix.ethereum.org/上的链接进入以太坊IDE。下面的截图显示了以太坊IDE：](https://remix.ethereum.org/%E4%B8%8A%E7%9A%84%E9%93%BE%E6%8E%A5%E8%BF%9B%E5%85%A5%E4%BB%A5%E5%A4%AA%E5%9D%8AIDE%E3%80%82%E4%B8%8B%E9%9D%A2%E7%9A%84%E6%88%AA%E5%9B%BE%E6%98%BE%E7%A4%BA%E4%BA%86%E4%BB%A5%E5%A4%AA%E5%9D%8AIDE%EF%BC%9A)

Remix是Solidity的一个在线编译器，用于编写智能合约代码。这个代码是官方给用户用以测试的。正如我们在下面的屏幕截图中看到的，它有一个变量和两个函数。变量c是一个整型变量并且是私有的，这意味着合约之外的任何人都不能访问它。第一个函数是plusbyone()，它通过递增来改变c的值，第二个函数是getC()，它访问c并将其值返回给该函数的调用者。

当计数器代码粘贴到Remix中时，它将如下面的屏幕截图所示：

现在打开Ganache，我们会看到这样的东西。在屏幕的顶部，我们可以看到它说的是RPC SERVER：

现在让我们试着在浏览器中访问MyEtherWallet，看看这样做的结果。在右上角，你将看到一个下拉菜单，显示MyEtherWallet连接到以太坊了。默认情况下，它连接到以太坊的主网络。我们必须通过点击下拉菜单来改变这个选项。单击Add Custom Network/Node选项，如下面的截图所示：

现在我们可以输入Ganache准备好的RPC服务器信息。我们可以如下所示命名节点：

MyEtherWallet已经通过Ganache与我们的自托管区块链连接。用MyEtherWallet上传智能合约。要执行此操作，我们将单击位于MyEtherWallet导航栏顶部的Contract选项卡，并选择Deploy Contract选项：

如我们所见，MyEtherWallet要求我们提供合约的字节码

要找到它，我们将回到Remix IDE并单击Details按钮：

现在我们将看到一个对话框，其中有关于计数器智能合约的信息。要复制字节码，我们将单击BYTECODE部分旁边的剪贴板图标：

现在将回到MyEtherWallet并将字节码粘贴到Byte Code文本区域：

现在可以向下滚动并导入一个账户地址来上传合约。默认情况下，Ganache会出现5个地址，可以使用它们与私有链进行交互。我们将回到Ganache，并且单击按键图标，这样就可以访问其中任何地址：

现在将看到私钥与账户的绑定：

现在必须复制这个私钥并将其粘贴到MyEtherWallet中：

现在可以单击Unlock按钮，并且MyEtherWallet会询问我们是否需要签署该交易并部署合约：

最后将看到一个成功的提示，如下面的截图所示：

交易成功后，Ganache将增加它的CURRENT BLOK值，我们用来部署合约的账户的交易数也将增加：

智能合约现在上传到了区块链。要通过递增和递减计数器与它交互，必须回到MyEtherWallet并选择Interact with Contract选项：

MyEtherWallet现在将要求我们提供新部署的智能合约所在的地址，以及我们合约的应用程序二进制接口（ABI）。我们可以按如下所示查看事务日志：

如你所见，Ganache告诉我们用于部署合约的地址。让我们单击交易，复制创建的合约地址，并将其粘贴到MyEtherWallet中：

下面的截图告诉我们，MyEtherWallet知道如何与我们的合约互动。我们将返回到Remix并单击界面ABI旁边的剪贴板图标来复制它：

现在我们必须回到MyEtherWallet，将ABI粘贴到其文本框中，然后单击Access按钮。我们可以通过单击Select a function下拉菜单与合约交互：

在我们的代码中，将计数cs的初始值设置为0。要确认智能合约工作是否正常，我们需要调用getC()函数：

我们可以看到合约被返回，但是我们也做了其他的函数plusbyone()。调用plusbyone()来测试它。我们将再次选择function下拉菜单，选择plusbyone，并创建一个新的交易：

这只是增加了c的值。现在，我们可以再次调用getcount()来确认值是否被更改：

EVM是一个分布式运行环境，用于构建和管理智能合约。在以太坊中，每一个程序都是由成千上万台电脑组成的网络来处理的。

智能合约被编译成字节码，一个名为EVM的部件可以读取和执行字节码。所有节点都使用各自的EVM执行此合约。根据基本定义，网络中的每个节点都拥有一个交易副本和智能合约的网络历史记录。EVM负责按照开发人员预先编写的规则执行合约。EVM通过基于堆栈的字节码计算这些数据，而开发人员则用高级语言（如Solidity或Serpent）编写智能合约。

gas
===

当以太坊网络中的每个节点都执行一个智能合约时，将耗费大量能源（gas）。因为消耗更多的能源意味着花费更多的钱，它也依赖于智能合约编程的水平。换句话说，EVM中的每一个低级操作代码都需要消耗一定数量的gas来执行其期望的输出。

Gas只是表示执行计算的成本，并帮助开发人员理解其智能合约代码的能源消耗。和比特币市场一样，gas的价值是由市场决定的。如果支付了更高的gas价格，节点将优先考虑这些交易以获取利润。

dApp
====

dApp采用了诸如加密标记和内部共识机制等激励机制。分布式应用程序不需要存储其所有状态。然而，基于以太坊的分布式应用程序确实存储了其可信状态，这为最终用户提供了一种经济的解决方案。

除了与以太坊区块链的客户端接口外，dApp客户端需要对前端进行编程。客户端通常是用JavaScript编写的，因为它们可以在Web浏览器中运行，而我们大多数人都有这种浏览器。

dApp浏览器使用dApp客户端（通常用JavaScript编写）与以太坊节点进行交互，然后与智能合约进行通信。dApp确保了与以太坊节点的连接，并提供了更改连接的简单过程。它还为用户提供了一个账户接口，以便用户可以轻松地与这些dApp交互。

在此基础上，我们介绍了以太坊的一些核心组件，并观察了智能合约在现实世界中的运行情况。

公有链
===

使用公有链，链接区块的过程总是使用各种节点，这些节点可以是独立的、不可信的，甚至是未知的，并且可以参与共识过程来校验区块。在公有链中，任何人都可以简单地在系统中下载区块链节点客户端并与任何人进行交易，也可通过区块资源管理器读取交易。比特币和以太坊就是公有链的一些主要例子。

比特币是第一个安全、可靠地进行资金转移的分布式平台。然而，以太坊被发明的目的不同——为任何人提供一个平台来开发他们自己的去中心化应用程序，不局限于只转移货币，而是转移任何价值。以太坊使用智能合约来实现一套自操作程序，这些程序在满足某些条件时执行。

私有链
===

设置私有链的组织将其配置为一个被许可的网络。它的建立是为了提供更好的交易隐私，并且适用于银行和其他金融机构。与公有链不同，仅用区块链节点客户端连接到因特网将不足以启动交易；与此同时，一个联盟链只允许特定的和预先验证过的人通过网络访问并传输任何类型的价值。

在该系统中，共识机制由预先选定的节点组控制和管理。这样，即使区块链在公共网络中工作，它仍然是受限制的，只能由特定的节点组或甚至单个节点控制和维护。私有链也可以根据其限制和控制级别被称为联盟链。

其中最流行的实现之一是Hyperledger Fabric，它是由Linux基金会托管的一个被许可的区块链框架。

了解区块链的体系结构和共识模型，请参阅[https://www.researchgate.net/publication/318131748\_An\_Overview\_of\_Blockchain\_Technology\_Architecture\_Consensus\_and\_Future\_Trends。](https://www.researchgate.net/publication/318131748_An_Overview_of_Blockchain_Technology_Architecture_Consensus_and_Future_Trends%E3%80%82)

区块链是比特币的基础，近期受到广泛关注。区块链就像一个不可改变的账本，允许交易以去中心化的方式进行。基于区块链的应用如雨后春笋般涌现，涵盖金融服务、信誉系统、物联网等众多领域，但区块链技术仍存在可扩展性、安全性等诸多挑战有待克服。本文对区块链技术进行了全面的概述。本文首先对区块链体系结构进行了概述，并对几种典型的共识算法进行了比较。此外，还简要列出了技术挑战和最新进展。我们还对区块链未来可能的发展趋势进行了阐述。

需要搭建一个实验环境，专门用于演示Hyperledger应用程序，以解决供应链管理中的一些实际问题。你需要在链接[https://github.com/hyperledger/education.git中获得源代码。](https://github.com/hyperledger/education.git%E4%B8%AD%E8%8E%B7%E5%BE%97%E6%BA%90%E4%BB%A3%E7%A0%81%E3%80%82)

Hyperledger是一项开源计划，旨在通过分布式账本技术满足行业核心需求，是由Linux基金会与信息技术、银行、物流、运输、金融、制造和物联网等多家行业巨头共同创建的一个联合项目。

如今，加密货币仍致力于与某些政府和企业机构建立信任，而区块链正是用于进行业务安全运营和管理的关键技术。由于比特币本质上的僵化与静态性质，它不适用于商业应用。虽然以太坊有能力通过其智能合约提升业务应用程序的扩展性，但由于其使用不受限制，金融机构和其他关键业务运营对于尝试使用以太坊区块链来进行它们的商业运营表现出犹豫的态度。

Hyperledger是唯一的分布式账本技术框架，专门为那些需要采用许可区块链来实现对整个系统进行更好控制的企业而精心构建的。因为Hyperledger更多地用于解决关键业务问题，它不支持任何加密货币平台或相关系统。

Hyperledger项目成立于2015年12月，目前已经得到了埃森哲、空中客车、美国运通、思科、富士通、日立、IBM、英特尔、SAP、NEC、BBVA、Bitmark、博世、CA Technologies、Capgemini、安永、Factom、华三、NSE、甲骨文、普华永道、Redhat、三星、Ripple、Thales、Wipro、云安全联盟等多家行业领导者的赞赏和采用。

Hyperledger项目还计划用于区块链爱好者、区块链社区、企业和非营利组织之间的协作，以及构建分布式账本应用程序的全面统一的标准。正如WordPress彻底改变了网站响应方式和启动时间一样，Hyperledger正在努力降低开发分布式账本应用程序的成本和总体时间。

Hyperledger项目因其为平台协作开发跨行业框架的先驱性，受到广泛赞赏。金融行业为了紧跟发展趋势，对与Hyperledger平台的合作表现得最为积极。让我们对Hyperledger的项目目标进行回顾，进一步理解其发展路线：

·社区驱动的基础设施：由于Hyperledger项目得到了一些私人和政府机构的支持，它提供了一个高效、开放的社区驱动的环境。

企业级框架：与加密货币区块链不同，Hyperledger的开发旨在支持企业通过分布式账本网络执行安全可靠的交易或事务处理。

·建立技术社区：该项目还旨在建立一个更具规模和效果的技术社区，以创新和开发区块链智能合约及其他相关代码。

·传播区块链意识：这是向企业和其他机构传播关于区块链技术意识及其业务应用思维的好方法。

Hyperledger是一个开源框架，允许企业基于分布式账本技术构建企业级解决方案。该框架包含以下组件：

·共享账本：一个内容仅可追加的账本，按时间顺序存储数据块。

·共识算法：一种实现对分布式账本内容的改变达成共识的协议方法。

·隐私：构建Hyperledger的主要目的是在具有关键任务的业务环境中实现具有安全可靠交易的许可网络。

·智能合约：这是一些用户计划和处理交易请求的微小程序过程。

让我们了解一下Hyperledger架构：

·共识层：主要负责根据预定义的规则生成每个订单的协议并校验交易。

·智能合约层：它负责交易请求和应用业务逻辑。

·通信层：用于协助节点间通过点对点传输进行通信的平台。

·数据存储抽象：允许其他模块使用各种数据来源。

·加密抽象：允许使用不同的加密算法而不影响其他模块。

·身份服务：使得在区块链设置期间可以使用额外的身份认证和授权。

·规则服务：负责管理多项规则，例如共识规则、背书规则和集团管理规则

API：使客户端和应用程序能够与区块链模块进行通信。

·互操作：提供了不同区块链实例之间的互操作性。

Hyperledger框架结构如下所示：

·Iroha：Hyperledger Iroha是由Soramitsu、Hitachi、NTT DATA和Colu贡献的区块链框架。它旨在供Android和iOS软件包下的移动应用程序开发人员使用，设计简洁，包含C++编程包和YAC一致性算法。

·Sawtooth：由英特尔提供，可以根据网络规模来选择使用多种共识算法。默认情况下，Hyperledger Sawtooth使用消逝时间量证明（PoET）来实现节点之间的一致性。它旨在实现多功能性，同时支持许可和非许可的实现。

·Indy：Hyperledger Indy是一个分布式账本，用于实现分散身份的业务解决方案，并提供跨多个支持分布式账本技术（DLT）的互操作性。它旨在实现跨节点和整个交易的隐私。

·Burrow：Hyperledger Burrow是一个基于权限的智能合约系统，它为模块化区块链客户端提供了一个使用以太坊虚拟机（EVM）构建的分权管理的智能合约解释器。

网络的多个节点之间建立和维护通信非常重要：

·节点（node）：Hyperledger网络中有以下三种角色：

·客户端（client）：客户端在网络上提出交易请求。它必须连接到一个对等节点才能加入区块链。客户端有权将所需要的对等节点连接到网络。

·对等节点（peer）：对等节点监听账本更新广播并保留副本。根据其性质，对等节点还可以分成两种类型：

·背书节点（endorsing peer）：负责对来自客户端的交易提案进行检查和背书

·确认节点（committing peer）：提交方在提交网络中的交易之前确认交易。

·排序服务（ordering service）：排序服务接受完成背书的交易，并将它们按序存储到一个区块中，最后将其交付给确认节点。排序服务还为客户端节点和对等节点提供共享和安全的通信通道。它充当广播交易的媒介，并帮助用户将其交付给对等节点。

·账本（ledger）：就像比特币和以太坊一样，Hyperledger账本提供了整个系统操作中所有有效和无效交易的验证列表。它由排序服务创建，并与网络中的所有对等节点保持一致。

·通道（channel）：Hyperledger Fabric中的通道是节点进行机密交易的受限通信媒介。通道特定于成员、共享账本、链码应用程序和订购服务节点。

通道的每个peer节点必须由成员服务提供者（MSP）进行授权，该授权服务提供者验证每个对等节点到其各自的通道对等节点及相应服务。

·世界状态（the world state）：这反映了有关网络中所有资产的当前数据状态。数据以下列格式安全存储：

·LevelDB：Hyperledger Fabric的默认数据库，它只存储键值对。

·CouchDB：最适合Web和本地应用程序，它本质上就是JSON。它通过支持二进制满足所有数据存储需求。

·链码（chaincode）：chaincode是由网络成员商定和创建的来执行业务逻辑的。可以是一个用GO——Node.js编写的程序：

·LevelDB：一种默认的编程语言，它运行在安全的Docker容器上并管理账本状态。

·CouchDB：另一种存储JSON对象的数据库编程语言。它还支持键值范围查询、复杂查询和完整数据查询。

·共识（consensus）：共识就是对添加到账本的一组交易达成协议的过程。在Hyperledger Fabric中，通过以下三个步骤实现了共识：

·交易背书。

·排序。

·校验和确认。

现在，让我们了解这些共识组件以及它们如何与Hyperledger及其交易处理方法一起运作。

Hyperledger的工作和交易处理流程可以解释如下：

1）交易提交：在Hyperledger Fabric中，整个流程从客户端应用程序提交交易开始：

每个客户端应用程序都可以提交交易给背书对等节点来进行模拟处理和背书过程。

2）背书者将RW集发送给客户端：每个背书对等节点模拟提议的交易并存储名为RW集合的读写数据集。这些数据集由签署背书对等节点签名，并返回给客户端应用程序：

交易背书：这是由模拟交易产生的签名响应。像智能合约一样，通过策略链码可以有多种方式定义交易背书。一个交易背书策略类似于一个定义的链码。

3）客户端应用程序服务：一旦客户端应用程序收到RW集和已批准的交易，它就必须将这些交易提交给排序服务。无论其他客户端应用程序是否确认了交易背书和RW集，此方法都会继续工作：

4）排序者将块中的交易发送给确认中的对等节点：排序服务接受RW集和已经背书的交易，将它们排列成块并将它们转发给确认中的对等节点：

排序服务负责组织所有交易，然后将它们提交进账本。默认情况下，Hyperledger Fabric的排序服务是Kafka，它是由Apache Software Foundation（ASF）开发的开源的流事务处理平台。

现在，让我们更详细地了解排序服务的工作原理。将其划分成几个核心部分非常重要：

·排序服务的第1部分：一旦在指定的时间范围内准备好一定数量的交易，就会创建一个块，并按时间顺序提交这些交易。与比特币区块链不同，Hyperledger Fabric提供了最适合的排序机制，这有助于企业设计精细、灵活且可扩展的分布式网络系统。

·排序服务的第2部分：Hyperledger Fabric支持三种排序服务机制——SOLO、Kafka和简化的拜占庭容错（Simplified Byzantine Fault Tolerance,SBFT）：

·SOLO：最适合软件开发人员进行研究和测试，而且只有一个排序节点。

·Kafka：另一种可应用于生产的Hyperledger Fabric订购机制。它由ASF开发，提供统一、高效、低延迟的软件平台，用来处理实时源。在Hyperledger Fabric中，Kafka处理RW集和背书交易。

·SBFT：类似于比特币区块链的PoW共识机制。该解决方案旨在克服拜占庭故障。即使网络中存在恶意节点或一组恶意节点，系统也能正常工作。

5）确认对等节点校验块中的每个交易：确认对等节点校验交易以确保RW集与当前世界状态匹配。一旦确认对等节点校验了交易，交易就会被更新到账本，并且世界状态会默认使用来自RW集的写入数据进行更新：

最后，确认对等节点必须通知客户端应用程序交易的成功或失败情况。

6）身份验证：在交易流程的每一步，从背书到版本检查，身份验证仍然是一个持续的过程。

比特币、以太坊与Hyperledger
===================

区块链平台的特征，以便能够更进一步了解那些流行的区块链平台之间的对比：

·权限限制：定义了交易处理器创建或阻塞现有账本的资格。在此上下文中，存在以下两种类型：

·许可区块链（permissioned blockchain）：在此模型中，交易处理只能由预先选择的用户执行。Hyperledger Fabric就是属于这一类。

·非许可区块链（permissionless blockchain）：此模型不限制交易处理器创建或添加新区块。以太坊和比特币就是当前最受用户欢迎的非许可区块链。

·受限制的数据访问：指定了区块链网络的读取权限。有以下两种类型：

·公共区块链：在读取正在进行的交易信息时没有限制。任何人都可以使用区块链节点客户端下载更新的区块链账本。

·私有区块链：在此类型的区块链中，区块链账本的访问仅限于预先选择的用户。

·共识机制：在分布式网络中，实现无信任网络并确定所有交易的共识至关重要。这确保了只将有效、合法的交易添加到区块链中。常见的共识算法有PoW、PoS和PBFT。

·可伸缩性：可伸缩性取决于两个因素——节点和性能。节点可伸缩性是指可以在不影响整体性能的情况下将节点添加到区块链网络中，并且可伸缩性取决于每秒的交易数。

·匿名性：指区块链中公开或隐藏的用户身份。

·治理：区块链社区中分配的决策权。区块链平台必须由核心开发团队或其他利益相关者来维护。

·原生货币：指区块链中有效的货币，如比特币区块链中的比特币。

脚本：指分布式应用程序（dApp）所支持的编程级别：

关于区块链与CIA安全三元组模型的细节：

·访问[https://ethereum.stackexchange.com/questions/25270/confidentiality-in-blockchain了解区块链的机密性。](https://ethereum.stackexchange.com/questions/25270/confidentiality-in-blockchain%E4%BA%86%E8%A7%A3%E5%8C%BA%E5%9D%97%E9%93%BE%E7%9A%84%E6%9C%BA%E5%AF%86%E6%80%A7%E3%80%82)

·访问[https://gdr-securite.irisa.fr/redocs/download/redocs17-gemalto.pdf了解私有链中的数据机密性。](https://gdr-securite.irisa.fr/redocs/download/redocs17-gemalto.pdf%E4%BA%86%E8%A7%A3%E7%A7%81%E6%9C%89%E9%93%BE%E4%B8%AD%E7%9A%84%E6%95%B0%E6%8D%AE%E6%9C%BA%E5%AF%86%E6%80%A7%E3%80%82)

PKI简析
=====

因特网允许任何人与其他人连接，而且与现实世界不同的是，地理或者物理障碍并不存在。这使得在因特网上正确识别一个人并建立进一步的可信交流变得十分困难。在下面的图中，Alice想通过因特网与Bob会话，然而，Bob拒绝了，因为他无法验证Alice的身份。

PKI通过在Bob和Alice之间添加一个可信第三方（TTP）来解决这个问题。在他们开始了解彼此之前，他们必须建立信任关系，而TTP有助于实现这一过程。在下面的图中，Alice与Bob共享数字证书，Bob使用来自授信机构的公钥来验证Alice的签名，进而对Alice进行身份认证。

在上图中，TTP是证书颁发机构（CA）。CA机构通过生成一个证书，帮助用户在因特网上确立其身份：

·PKI：PKI提供了一个层次标准来管理实体数字资产，从而建立一个安全的通信信道。且PKI不是仅限于用户使用，它还被广泛用于多个不同的应用系统，如电子邮件、Web应用程序、智能卡等，稍后将对此进一步介绍。

·网络设备：PKI用于控制对路由器和交换机的访问，进行基于802.1X的身份认证。

·应用程序：应用程序需要从CA获得签名证书才能在操作系统中运行。

·IPsec隧道：路由器和防火墙使用证书对网络上的其他端点进行身份认证。

·Radius服务器：由PKI证书保护轻量级目录访问协议（LDAP）查询。

![](https://storage.googleapis.com/papyrus_images/6c7ca69f7b166ae588315e5c2b7fc882e69580a2c984178a1ffd54808f554467.png)

PKI架构的一种实现，最初X.509设计详细阐述了通过CA数字签名的证书存储和公钥分发的过程。然而，X.509的配置文件并没有详细说明如何支持证书的许多子字段和扩展，如下图所示：

在各标准制定方的共同努力下，最终为X.509版本3的PKI以及版本2的证书撤销列表等内容准备了大纲。在正式发布RFC 2459之前，提出了大约11个用于增强X.509标准的草案。

RFC 2510是为了指定PKI中使用的消息协议而开发的。此后，针对增加登记协议的需要和对于PKCS#10消息格式的偏好，出现了两个并行的发展线路。下图解释了PKI信息头的演变过程。在版本2中，发布者的唯一标识ID和主题的唯一标识ID被添加到信息头中。在版本3中，引入了一个扩展字段来标识规则和其他相关信息，如下图所示：

此外，证书请求的语法是在带有PKCS#10的S/MIME WG中开发的。RFC 2510中定义了一个简单的用户登记协议，但是它没有使用PKCS#10作为证书请求格式。

组成部分
====

PKI是各种组件、应用程序、规则和实践的集合体，它们共同组合和保障了完整性、身份认证和不可抵赖性这三元安全要素的实现。数字证书是PKI的主要组成部分，在因特网上起着数字身份证的作用。以下将分别介绍PKI的五个核心组件。

1.非对称密钥加密

在密码学中，加密是一个对信息进行编码的过程，从而保证只有相关方能够查看并理解原始信息。这种对信息进行加密的编码过程可以用两种方式实现：对称加密和非对称加密，分别解释如下：

·对称加密：在对称加密中，数据的加密和解密过程使用同一个密钥。这需要确保双方使用相同的密钥对数据进行加解密，如下图所示：

·非对称加密：在非对称加密中，使用不同的密钥来加密和解密数据。每个密钥对是由公钥和私钥共同组合而成的。公钥用于加密数据，而私钥用于解密数据。公钥与因特网上的数据一起存在，而私钥则由使用它的用户个体来负责保存，如下图所示：

公钥和私钥对可以由两个唯一相关的图形密钥组成。下面是公钥的一个例子：

公钥通过网络提供给所有人，并存储在可访问的存储或目录中。另一方面，私钥必须为其所有者保持私有状态，所以它有时也被称为密钥公钥和私钥在数学上是相互联系的。使用公钥加密的数据只能由对应的私钥解密。

2.证书

证书是一种电子ID，表示了希望通过网络进行通信的用户或设备的身份。该证书基本上确保了只有合法用户才能连接到网络。证书是由受信任的第三方（即CA）对公钥签名而生成的。

以下是三种常用类型的证书：

·安全套接字层（SSL）证书：SSL服务器证书安装在服务端主机服务器上，例如Web应用程序、邮件服务器、目录或LDAP服务器。此证书包含该应用程序所属组织的标识信息。SSL证书还包含一个系统公钥。证书的主题（certificate subject）与服务器的主机名匹配。此证书必须由受信任的证书颁发机构签名。主要主机名作为证书主题字段中的通用名称（Common Name）列出。

·客户端证书：客户端证书用于标识网络用户、设备、网关或任何其他类型的设备。它是一个数字凭证，用于校验拥有证书的客户端身份。今天，许多应用程序允许通过证书对特定资源的用户进行身份认证，而不是通过用户名和密码。通过电子邮件进行通信的两个用户还可以使用客户端证书认证各自的身份。

·代码签名证书：代码签名证书用于对系统上运行的软件进行签名。在用户机器下载数百万个应用程序的情况下，验证程序代码非常必要，因此，代码签名证书在其中扮演着重要的角色。

·电子邮件证书：发件人需要通过S/MIME协议为任何给定收件人选择使用相应的公钥。发件人可以从电子邮件证书中获取此信息。通常，当电子邮件在组织内部通信并使用自己的CA时，使用S/MIME协议。

3.证书颁发机构

证书颁发机构（CA）是一个受信任的第三方机构，它证明用户、服务器、数据库和管理员就如同它们自己声称的那样。CA检查用户的凭证并授予证书，并使用密钥对其进行签名。CA可以是一个开放的解决方案，也可以是提供证书服务的受监管解决方案，如下图所示：

CA的职能如下：

·签发及交付证书。

·将证书和证书撤销列表（CRL）发布到存储库。

·管理来自证书所有者的撤销请求。

在下面的截屏中，我们可以看到客户端系统中的数字签名列表。列表中的证书是由多家证书颁发机构签发的并具有各自的有效期：

不同类型的CA如下：

·公共数字证书颁发机构：有些公共证书提供者对用于商业和个人目的的证书进行管理。只有在支付了特定的费用后才能获得这些CA颁发的数字证书。

·私有数字证书颁发机构：企业或机构的系统管理员可以向域内的系统应用和用户颁发证书。例如Windows服务器可以创建和存储密钥对，但是这些私有证书对于外部通信无效，仅限内部使用。

4.注册机构

注册机构（RA）负责认证需要授信的新实体的身份。它还维护本地注册数据信息，并发起旧证书的更新和撤销过程。

RA的功能如下所示：

·负责对需要CA证书的新用户或系统进行身份认证。

·负责执行CA的部分功能。

·负责充当CA的代理。

·负责针对证书延期和证书撤销过程进行本地注册数据的更新维护。

5.证书存储库

证书存储库（CR）是一个证书数据库，PKI环境中的所有节点都可以访问它。它还保存证书相关撤销信息和策略信息。此存储库以证书撤销列表的形式来获取更新的证书列表。

证书存储库的功能如下：

·它允许以未经身份认证的方式检索信息。

·它充当数据库来保存公钥证书、撤销列表和策略等信息

PKI架构在一个称为信任链的模型上进行工作。该模型存在于每个身份之间的信任关系中。具体来说，两层和三层的层次结构之间的区别是，第二层放置根CA（root CA）或者发行CA（issuing CA）。使用二层CA的主要原因是可以设置一个策略CA（policy CA），负责给证书颁发CA发放证书。由此，三层的层次结构可以提供更好的安全性。策略CA也可以担任系统的管理边界。如果管理员由于密钥泄露而需要撤销许多CA，这种设计也很有用，可以在第二层执行撤销，保留根的其他分支可用，如下图所示：

在签名过程中，根CA使用其密钥对中间证书进行数字签名。这个过程保证了发放证书的真实性，声明所发放的中间证书是根CA信任的。每个CA都可以从客户端接收授权请求并发放证书。通常，客户端无法访问根CA，但客户端有资格持有根CA证书。客户端将证书请求发送到所属的CA来获取安装证书，如下图所示：

在下面的图中，我们可以看到共享数字证书的流程和对它们的解密。为了认证一方的身份，数字证书使用公钥解密：

在理解了具有身份、中间人和根证书颁发机构的数字证书的层次结构之后，让我们来了解如何在浏览器客户端和使用SSL的网站之间建立信任连接通信。客户端请求访问HTTPS网站。客户端的浏览器预先加载了许多根CA证书。步骤如下：

1）客户端连接到使用SSL的网站。

2）网站将其身份和中间证书返回给客户端。

3）客户端使用中间证书的公钥解密数字签名，从而确认中间证书的真实性。

4）客户端确认所请求的URL与身份证书中的URL相匹配。如果不匹配，将会显示一个警告。

5）客户端使用公钥加密或解密流量，服务器使用私钥加密或解密流量

多密钥加密周期流程图：

![](https://storage.googleapis.com/papyrus_images/63f8b2362993aee5d0fe286256a36669b172b10c983274f1f64c44b28591d2c8.png)

我们可以进一步了解使用和处理密钥的几个阶段：

·密钥创建：密钥生成并存储在密钥管理服务器上。密钥管理器使用一个安全的随机位生成器，通过加密过程生成密钥对。一旦密钥对被创建，它就会与其所有属性一起存储在密钥存储数据库中。属性通常由名称、大小、实例、激活日期、翻转、镜像值、密钥访问和其他关联属性组成。可以计划密钥激活时间，也可以在创建密钥时激活密钥。加密密钥管理器跟踪加密密钥的当前和过去的实例。

·密钥使用和滚动更新：密钥管理器负责允许授权用户或系统去检索信息，并允许它们处理加密或解密。它还负责管理加密密钥的整个生命周期和每个密钥实例的状态。如果一个机构的策略规定它应该每年使用一组新的密钥，那么密钥管理器应该保留密钥的以前版本，只分发当前版本。但是，为了执行解密过程，仍然可以检索以前的版本。

·密钥撤销：管理员连接到密钥管理器服务器来撤销密钥，以便不再将其用于进一步的加密和解密过程。如果需要，管理员甚至可以重新激活密钥，并将其用于接下来的过程。在某些情况下，管理员还可以使用从以前加密数据（比如从旧的备份）解密出的数据。密钥生命周期如下图所示：

·备份（第三方托管）：NIST建议对所有停用的密钥进行归档。必须保护该存档不受任何未授权修改、删除的影响。还建议在其密钥周期结束后提供一个可恢复的密钥机制。

·密钥删除（销毁）：如果密钥泄露或长时间未使用，管理员应选择从加密密钥管理器的密钥存储数据库中删除密钥。密钥管理器删除密钥及其所有关联实例，或者它可以特定地删除某些实例。当受损害数据处于加密状态时，此选项扮演重要角色。如果密钥被删除，受损害的数据将是完全安全的，不可恢复的，因为无法重新创建相同的加密密钥。

密钥管理互操作性协议（KMIP）用于客户端和服务器之间的通信，对密钥管理系统维护的存储对象执行管理操作。这是在整个生命周期中管理加密密钥的一种标准化方法，开发它目的是为了方便对称和非对称加密密钥、数字证书和其他相关模板去简化对象创建和管理，具体说明如下：

结构化信息标准推进组织（OASIS）是一个非营利组织，为人们在网络上和机构内交换信息提供标准。根据OASIS的指导准则，客户端可以向密钥管理服务器请求一系列对象和操作：

·创建密钥或密钥对：请求生成新的对称密钥或新的公/私钥对，并注册新的托管加密对象。

·注册：用密钥、密码或其他加密资料注册托管对象。

·替换密钥：为了生成替换密钥（也称为更改密钥），替换密钥用于现有的对称密钥或现有的公/私钥对的密钥对。

·派生密钥：为了获得对称密钥，派生密钥用于获取密钥管理系统已经知道的数据对象。

·定位：为了找到一个或多个托管对象，定位请求用于获得请求中指定的属性。

·检查：根据请求中指定的值，检查托管对象的使用状况。

获得属性：用于返回由其唯一标识符指定的托管对象或与托管对象关联的多个属性。

·增加、修改或删除属性：这些属性用于添加、删除或修改与托管对象关联的属性实例。

·激活：用于激活托管加密对象。

·撤销：用于撤销托管的加密对象。

·销毁：当需要销毁特定托管对象的关键材料时使用。

·存档：用于指定托管对象归档。

·恢复：用于访问数据恢复进程

PKI模型面临的挑战
==========

![](https://storage.googleapis.com/papyrus_images/1aa759fea5ff09d19e8bee3aebcc777521091e2d8c9cf0aae90fc02ff3a660d9.png)

问题1—额外安全的需求：根据2016年波耐蒙研究所的一份报告，62%的企业已经使用PKI部署了基于云的应用程序，比2015年增加了50%。如果中央证书存储库受到破坏，将导致大量数据泄露和账户被盗。机构倾向于使用额外的安全层，例如硬件安全模块（HSM）来保护它们的PKI。HSM被用于保护PKI最关键的根，并且用于颁发CA私钥。机构倾向于为管理员和HSM选择使用多因素身份认证。

·问题2—中心机构：在当前的网络状态下，中心机构（根机构）负责管理DNS请求和响应（根机构）、X.509证书等。因此，所有联网的设备和系统都必须信任第三方来管理公钥和标识符。举个例子，一个域名，尽管它已经被其所有者购买，但实际上它由第三方（如因特网名称与数字地址分配机构（ICANN）、域名注册机构或证书颁发机构等）控制监管。

此外，这些受信任的第三方有能力破坏和损害全世界用户数据的完整性和安全性。在一些案例中，这些受信任的第三方将客户的信息共享给了安全执法机构及其他机构。它们既可以为了经济利益这样做，也可以为了进行用户行为分析这样做。

PKI由于其集中的管理机制，会存在较大的漏洞。区块链从根本上来说是分散的、去中心化的，允许多个参与方之间的通信，而不需要任何第三方的参与。去中心化的方法可以是PKI的范式转移，然而，需要一个系统的方法来部署实施。

![](https://storage.googleapis.com/papyrus_images/38b2a84b7af72873db4f4620222a044a6eddd78539da0def5eaa7059055ae649.png)

区块链是一个多参与方的分布式网络，没有第三方的参与。分布式公钥基础设施（DPKI）是一个全新的概念，它在公共系统上实现身份认证系统，而不依赖于可能危及系统完整性和安全性的单个第三方。正如我们已经知道的，区块链是用基于一种不可信方法构建的，这种方法允许受信任和不受信任的多方相互通信。然而，信任通常是在地理上和政治上不同的参与者之间建立的，他们对账本的状态有几个共识模型。根据定义，区块链允许使用网络中的多个节点存储任何类型的值。对于DPKI，这个值将是机密的。

主体可以通过在区块链中注册标识符来直接控制全局可读的标识符，比如网站域名。对于密钥数据库，主体使用标识符查找密钥。区块链可以允许分配机密资产，如公钥和其他属性，并允许这些值以安全的方式全局可读，不会被任何MITM破坏，这在PKIX中是可以做到的。通过允许正确的公钥链接到标识符值来实现，而身份认证则是通过标识符查找到最新的公钥来执行的。

在DPKI设计中，系统虽然是分布式的，但标识符仍然由主体控制，消除了标识符数据存储被破坏的风险。

![](https://storage.googleapis.com/papyrus_images/cc766f300497df7c2ec42fc7c04dcd437d574432fb16bb15eea717d4ec83238c.png)

去中心化PKI（DPKI）

去中心化公鑰基礎設施（DPKI）是設計更好的PKI系統的另一種方法。 Pretty Good Privacy（PGP）是Phil Zimmermann開發的一種加密貨幣程序，是一種在區塊鏈不存在時創建的去中心化信任系統。

它與建立各方之間的信任關係有關。但今天沒有必要第三方。區塊鏈是一種建立更有能力，更安全的PKI系統的新方法。

但是區塊鏈如何改善PKI？在去中心化的PKI中，區塊鏈充當去中心化的鍵值存儲。它能夠保護數據讀取以防止MITM攻擊，並最大限度地降低第三方的能力。通過將區塊鏈技術的強大功能引入系統，DPKI解決了傳統PKI系統的問題。

管理框架的去中心化性可以通過證書撤銷解決CA系統的問題，消除單點故障，並快速響應CA的濫用。區塊鏈能夠使進程透明，不可變，並防止攻擊者入侵，從而有效避免MITM攻擊。

在2015年，艾倫等人。在一份名為「去中心化公鑰基礎設施」的出版物中進行了探討，與傳統方法不同，DPKI確保任何單個第三方都不會損害整個系統的完整性和安全性。在區塊鏈驅動的DPKI中，新的第三方成為礦工或驗證者。

基於共識協議建立和維護信任。第三方，礦工或驗證人，必須遵守議定書的規則，這將在經濟上獎勵和懲罰這些第三方，以有效防止區塊鏈中的不當行為並限制其角色。

作者在2015年的論文中寫道，「通過使用能夠使地理和政治上不同的實體就共享資料庫的狀態達成共識的技術來去中心化信任」，區塊鏈允許分配任意數據，如這些標識符的公鑰，允許這些值以安全的方式全局讀取，不易受PKIX中可能發生的MITM攻擊。「

此外，研究人員認為，密鑰管理的邏輯可以在區塊鏈的智能合約上實施，並且「使用區塊鏈中的智能合約實現基於隱私的去中心化公鑰基礎設施（PKI）」，Sivakumar P和Kunwar Singh博士的2017年出版物成功實施了它。

然而，區塊鏈還不完善，因為它需要一個設備來同步一致的共識數據。今天的Geth（Go-Ethereum）客戶端提供多種類型的同步模式：完全同步，快速同步，光同步。總部位於台灣和美國的區塊鏈計劃Diode最近開發了一種名為BlockQuick的輕客戶端協議，旨在以低帶寬建立去中心化的信任。

下表是Geth，FlyClient，BlockQuick，傳統Web PKI客戶端的不同類型的同步模式，信任模型，帶寬和持續時間的比較。

![](https://storage.googleapis.com/papyrus_images/0a556cc9adef93d906c3374b81ffc69ec589f59ca2a034d1faca691c7acc991a.png)

以太坊是众多区块链平台中最灵活、最可靠的平台之一。它是一个可编程的区块链，适合粒度性的和基于策略的PKI系统。PKI可以通过以太坊区块链中的智能合约来实现其功能。每个实体可以有多个属性来认证所有权，而这些实体可以是公钥或以太坊地址。每个交易使用公钥标识，然后由相应的实体ID和PKI表示。智能合约用于对PKI中各种操作的事件和功能进行编程。智能合约还可以配置为调用特定的PKI操作，如创建、派生、删除、销毁等。这些功能和流程将以可靠的方式编写并部署在EVM中，这将为PKI操作提供方便的用户管理。以下PKI操作是通过智能合约而提供的：

·实体注册：用户或系统通过从智能合约调用注册事件添加到PKI系统。实体十分简单，可以是以太坊地址、公钥、属性ID、数据和数据哈希。智能合约上配置的事件会收集实体并将其作为交易转发给以太坊。通过挖矿共识过程，队列中的交易被打包成块，并被附加到区块链上。

·属性签名：实体可以通过注册事件进行特征化。实体的每个属性都可以通过智能合约由PKI系统签名，并发出交易。此签名实体稍后将提供给其他实体或用户。

·属性检索：实体的属性可以通过对区块链应用筛选器来定位，筛选器使用智能合约上配置的事件的各自ID作为索引。

·撤销签名：这是任何PKI解决方案撤销属性或实体上的数字签名所需要的最关键的功能之一。当用户丢失其密钥或密钥泄露时，撤销签名变得极为重要。可以配置智能合约以调用撤销事件，并且撤销特定实体上的签名。

在DPKI部署中，注册机构仍然在基础设施中发挥作用，但为了确保实体的身份在网络中得到表示，其作用受到以下限制：

·需要确保软件始终处于主体和对应密钥的控制之下。

·必须以分布式的方式生成私钥，以确保它们仍在各自主体的控制之下。必须严格禁止替代其他主体生成密钥对。

·没有一个实体能在未经主体同意的情况下对其他实体进行修改。

·一旦通过以太坊智能合约在区块链中创建了命名空间，它就不能被销毁。标识符的注册和更新必须是透明的。

·默认情况下，管理标识符的软件必须确保所有操作（如创建、更改、更新或删除标识符）都通过去中心化的机制转发。

实验
==

首先打开Node.js和Ganache-CLI框架。在本地系统中创建整个以太坊环境时，必须仔细地执行ganache-cli的安装。采取以下步骤：

1）用[https://nodejs.1.org/uk/download/package-manager/#arch-linux上展示的命令安装Node.js。](https://nodejs.1.org/uk/download/package-manager/#arch-linux%E4%B8%8A%E5%B1%95%E7%A4%BA%E7%9A%84%E5%91%BD%E4%BB%A4%E5%AE%89%E8%A3%85Node.js%E3%80%82)

2）在终端运行以下指令：

现在，我们使用下图的命令启动测试网络：

3）现在我们必须启用开发者模式，以详细查看浏览器内容。还必须打开LOAD UNPACKED扩展选项，如下面的截图所示：

CA可以发布响应策略（RP），如果未授权证书被颁发，则该策略将生效。在测试过程中，我们需要注册域证书策略（DCP）并创建响应策略。测试可以在本地系统上通过以下步骤完成：

1）首先需要添加一个检测器并注册它。需要以下脚本，通过定义检测器ID添加检测器：

2）我们现在将注册一个域所有者用于颁发证书的CA。需要定义CA ID、CA拥有者的地址和名称，如下图所示：

3）使用CA注册DCP，如下图所示：

4）在智能合约下创建一个相关的RP，如下图所示：

5）当检测器接收到恶意证书报告时，撤销证书，如下图所示：

6）当CA频繁出现错误行为时，检测器可以将CA列入黑名单，如下图所示：

在以上过程中，我们成功地将PKI在以太坊区块链上进行了部署。有了这个基础设施，我们描述了从注册CA到请求响应支付的整个过程。我们成功地开发了一个描述响应支付的模型，并开发了一种对行为不当的CA实施问责的方法。

PKI框架及相关技术：

·在[http://www.oasis-pki.org/resources/techstandards/了解PKI技术基础。](http://www.oasis-pki.org/resources/techstandards/%E4%BA%86%E8%A7%A3PKI%E6%8A%80%E6%9C%AF%E5%9F%BA%E7%A1%80%E3%80%82)

·在[https://eprint.iacr.org/2016/1018.pdf了解IKP：用区块链技术改变PKI。](https://eprint.iacr.org/2016/1018.pdf%E4%BA%86%E8%A7%A3IKP%EF%BC%9A%E7%94%A8%E5%8C%BA%E5%9D%97%E9%93%BE%E6%8A%80%E6%9C%AF%E6%94%B9%E5%8F%98PKI%E3%80%82)

·在[https://www.ssh.com/pki/了解PKI。](https://www.ssh.com/pki/%E4%BA%86%E8%A7%A3PKI%E3%80%82)

区块链的DNS安全平台
===========

域名系统（DNS）的主要作用是将被查询的主机名解析为IP地址。因特网用户通常通过域名来访问某些网页，例如[www.packtpub.com，但因特网需要一个IP地址才能将访问请求路由到期望的目的地。因此，DNS就像因特网的一本电话簿，允许每个人在全球范围内使用它，这当然也很可能有滥用的情况。在本章中，我们将了解DNS基础设施、核心组件、现有系统面临的挑战以及区块链可能如何对这些功能进行变革优化。在本章中，我们将介绍以下主题：](http://www.packtpub.com%EF%BC%8C%E4%BD%86%E5%9B%A0%E7%89%B9%E7%BD%91%E9%9C%80%E8%A6%81%E4%B8%80%E4%B8%AAIP%E5%9C%B0%E5%9D%80%E6%89%8D%E8%83%BD%E5%B0%86%E8%AE%BF%E9%97%AE%E8%AF%B7%E6%B1%82%E8%B7%AF%E7%94%B1%E5%88%B0%E6%9C%9F%E6%9C%9B%E7%9A%84%E7%9B%AE%E7%9A%84%E5%9C%B0%E3%80%82%E5%9B%A0%E6%AD%A4%EF%BC%8CDNS%E5%B0%B1%E5%83%8F%E5%9B%A0%E7%89%B9%E7%BD%91%E7%9A%84%E4%B8%80%E6%9C%AC%E7%94%B5%E8%AF%9D%E7%B0%BF%EF%BC%8C%E5%85%81%E8%AE%B8%E6%AF%8F%E4%B8%AA%E4%BA%BA%E5%9C%A8%E5%85%A8%E7%90%83%E8%8C%83%E5%9B%B4%E5%86%85%E4%BD%BF%E7%94%A8%E5%AE%83%EF%BC%8C%E8%BF%99%E5%BD%93%E7%84%B6%E4%B9%9F%E5%BE%88%E5%8F%AF%E8%83%BD%E6%9C%89%E6%BB%A5%E7%94%A8%E7%9A%84%E6%83%85%E5%86%B5%E3%80%82%E5%9C%A8%E6%9C%AC%E7%AB%A0%E4%B8%AD%EF%BC%8C%E6%88%91%E4%BB%AC%E5%B0%86%E4%BA%86%E8%A7%A3DNS%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E3%80%81%E6%A0%B8%E5%BF%83%E7%BB%84%E4%BB%B6%E3%80%81%E7%8E%B0%E6%9C%89%E7%B3%BB%E7%BB%9F%E9%9D%A2%E4%B8%B4%E7%9A%84%E6%8C%91%E6%88%98%E4%BB%A5%E5%8F%8A%E5%8C%BA%E5%9D%97%E9%93%BE%E5%8F%AF%E8%83%BD%E5%A6%82%E4%BD%95%E5%AF%B9%E8%BF%99%E4%BA%9B%E5%8A%9F%E8%83%BD%E8%BF%9B%E8%A1%8C%E5%8F%98%E9%9D%A9%E4%BC%98%E5%8C%96%E3%80%82%E5%9C%A8%E6%9C%AC%E7%AB%A0%E4%B8%AD%EF%BC%8C%E6%88%91%E4%BB%AC%E5%B0%86%E4%BB%8B%E7%BB%8D%E4%BB%A5%E4%B8%8B%E4%B8%BB%E9%A2%98%EF%BC%9A)

·DNS。

·DNS结构和层次。

·大型企业的DNS拓扑。

·当前DNS面临的挑战。

·基于区块链的DNS解决方案。

·实验。

DNS是因特网的核心服务。如果DNS不可用，我们每个人都将很难在因特网上查找资源。作为因特网的庞大电话簿，整个在线系统在很大程度上依赖于DNS。正是由于DNS命名空间的存在，我们都无须记住IP地址列表，而只需要记住网页的名称（域名）。

对于IT和安全领域的专业人员而言，了解DNS的基本结构、功能和操作是非常重要的。DNS是具有权限代理的分层数据库系统。就本章所叙述的范围来说，我们将考虑企业级DNS部署及其功能。企业或组织可以通过两种方式管理其DNS基础设施——通过允许因特网服务提供商（ISP）对其进行管理，或在内部进行管理。ISP网络中的任何错误配置或故障都会影响企业的因特网基础设施。

随着因特网用户数量的不断增加，DNS成为因特网企业的业务支柱，这种重要性也使得企业需要牢牢控制自己的DNS。通过高效的DNS部署，企业甚至可以实现更有效的垃圾邮件过滤和网络拓扑优化。以下是DNS在企业中发挥重要作用的几种方式：

·反垃圾邮件：某些DNS机制（包括发件人策略框架（SPF）和DomainKeys识别邮件（DKIM））确保只有预定义列表中的域才能以相应组织的名义发送电子邮件。只有在组织中的DNS正常工作的情况下，这种机制才是有效的。

·负载共享：DNS服务可以通过流量分配，让低负载服务器共担高负载服务器的流量，进而优化服务器基础设施。

·隐私：DNS服务通过屏蔽具有不同域名的地址来保护组织命名空间信息的隐私，这主要取决于它们是从网络内部还是外部进行访问的，从而有助于实现更强大的网络安全性。

TLD是DNS层次结构中最高级别的域之一。TLD设置在命名空间的根区域中。并且系统最后部分中的域必须使用完全限定的域名来识别。因特网名称与数字地址分配机构（ICANN）确保了TLD由授权的组织进行管理。因特网数字分配机构（IANA）由ICANN运营，同时又负责管理DNS根区域。

IANA负责管理以下TLD：

·ccTLD——国家代码TLD。

·gTLD——通用TLD。

·.arpa——基础设施TLD。

下面的分层图就是现有的TLD结构：

![](https://storage.googleapis.com/papyrus_images/714e22ba6ed114f8f8945d42d351acc081d8eba8220518e976a62817cc984cc3.png)

DNS存储了庞大的域名数据库。为了执行注册流程，需要三个实体一起协同工作——注册管理机构、注册商和注册人。

·注册管理机构：该组织是来维护命名空间数据库的，并且拥有该数据库的编辑权限。注册管理机构运行着命名空间的权威NS并管理着TLD名称。它们的职责是创建域名扩展，为域名设置规则，以及与注册商合作为公众提供域名。例如，Verisign管理.com域名及其DNS的注册。

·注册商：该组织保存域名并被认可向公众出售域名。这种注册商必须通过通用顶级域名（gTLD）注册机构或国家/地区代码顶级域名（ccTLD）注册机构进行认证。注册商在域名注册管理机构的指导准则下开展工作。

只有指定的注册商才能修改或删除中央注册数据库中域名的相关信息。终端用户直接从注册商处购买域名，并且最终用户拥有改变注册商的所有权利，即可以在注册商之间进行域名迁移。一些最受欢迎的注册商是GoDaddy、HostGator、BigRock等。

·注册人：拥有域名权限的终端用户。作为域名注册人，每个人都有一定的权利和责任，包括从用户注册商处获取有关注册、管理、迁移、续订和恢复域名注册的流程信息。

DNS记录是与DNS服务器关联的映射文件。无论一个域名与哪个IP地址相关联，这些服务器处理发送到每个域的DNS请求。各种字符串的作用就类似于DNS服务器中运行的行为组件，这些命令字符串称为DNS记录语法。这些记录包括A、AAAA、规范名称（CNAME）、邮件交换（MX）、指针（PTR）、域名服务器（NS）、授权开始（SOA）、服务（SRV）记录、文本（TXT）和名称权限指针（NAPTR）。让我们详细探讨这些DNS记录。

·SOA：SOA记录描述了区域文件的开头。它由区域名称、技术联系点、NS、序列号和超时值组成：

·NS：NS记录标识区域的授权域名服务器。NS还将子域委托给区域文件上的其他组织。在前面的示例中，我们可以清楚地看到[www.google.com的NSes列表。](http://www.google.com%E7%9A%84NSes%E5%88%97%E8%A1%A8%E3%80%82)

·记录：地址记录的建立是从名称到地址的前向绑定。在此示例中，我们使用域[www.google.com映射了IP地址：](http://www.google.com%E6%98%A0%E5%B0%84%E4%BA%86IP%E5%9C%B0%E5%9D%80%EF%BC%9A)

·MX记录：其用来标识能交换电子邮件的服务器。优先级始终与每个记录相关联，因此用户可以配置选择主邮件服务器和备份邮件服务器。

·TXT记录：这些记录提供了一种通过DNS提供信息扩展的方法。此文本记录存储有关SPF的信息，该信息可以识别授权服务器，以便其代表你的组织来发送电子邮件。

·CNAME：CNAME本质上是绑定流量的域和子域文本的别名。它们表明安全文件传输协议（SFTP）服务器与邮件服务器位于同一系统上。CNAME起着重要作用，特别是当服务器不受直接控制时，例如托管的Web服务器。

·PTR记录：这些记录用来提供从地址到名称的反向绑定。PTR记录应与前向映射完全匹配。

以太坊的安全DNS基础设施实验
===============

区块链技术具有变革多个行业的能力，所以在本章中我们将使用它来管理域名服务器，以应对一些最关键的DNS挑战。其中使DNS框架免受欺骗的最活跃项目之一为DNSChain。

DNSChain是一个基于区块链的DNS软件套件，它取代了X.509公钥基础设施（PKI）并提供了MITM认证证明。它允许因特网用户为DNS查询设置公共的DNSChain服务器，并访问域名以.bit结尾的服务器。

![](https://storage.googleapis.com/papyrus_images/11de6ff50da69340b0007e9891d5a50f593db43b87f6c2962326003bf24fdb9b.png)

X.509是一个标准框架，它定义了PKI的格式，以识别因特网上的用户和实体。它可以帮助因特网用户检验与指定网站的连接是否安全。DNSChain能够提供不依赖于第三方的可扩展的分布式的替代方案。

可以用公钥锁定技术来摆脱MITM攻击问题。公钥锁定可以指定两个pin-sha256值，即指定两个公钥。其中一个是当前证书链中任何公钥的锁定，另一个是不在当前证书链中的任何公钥的锁定：

·这个方案与现有DNS服务器并行工作。

·网站和用户可以将他们的公钥存储在区块链中。

·密钥通过DNSChain软件框架进行共享。

DNS基础设施一直是网络中面临最大风险的资产之一。传统DNS容易受到多种复杂威胁的攻击。又因为当前的DNS系统是分层的，所以系统根服务器成为了高价值的攻击目标。由于整个基础设施是集中式的，即使轻微的故障也可能导致整个系统故障。一群工程师——Greg Siepak和Andrea Devers开发了一个基于以太坊的DNS服务平台，用于连接客户端和域名服务器，而不需要任何第三方参与。该项目名为DNSChain，并已经在GitHub上托管，链接地址为[https://github.com/okTurtles/dnschain。](https://github.com/okTurtles/dnschain%E3%80%82)

在Ubuntu中配置DNSChain服务器。实验将会运行PowerDNS Recursor，按照预期发布针对.com和.net域的DNS查询，但会查询本地Namecoin区块链来解析.bit域。我们将启动一个Ubuntu LTS的新快照。在实验中，我们将在亚马逊的AWS云上部署这个Ubuntu系统。

此处的一些示例可能使用了过期域名，因此最好在你在Namecoin区块链上注册的域上测试域名解析。启动一个Ubuntu 16.04 LTS的新快照。我是在Amazon Cloud上使用Ubuntu 16.04 LTS的。

安装：我们需要在本地系统中安装namecoin区块链如下：

配置namecoin，请按照快速入门指南进行操作。本教程将使用当前用户，而不是创建多个用户。

·配置：完成Namecoin的安装后，我们需要使用以下命令配置区块链：

我们将继续运行namecoind来开始工作。可以使用namecoind getinfo检查下载区块链的进度。

对于Ubuntu，可以使用upstart而不是systemd。我们需要将此文件写入/etc/init/namecoind.conf，记住替换你的用户名。例如在我的环境中，用户名为ubuntu：

我们现在必须使用namecoind stop来停止进程。在此之后，我们需要发出sudo initctl reload-configuration命令，然后使用sudo shutdown-r重新启动。最后，namecoin便会自动重启。

·验证：如上所述，namecoind将开始下载区块链。在区块链有一定进度之前，我们将无法从区块链中查找域名。稍后，当我们重新访问Namecoin时，我们可以尝试以下命令：

将使用以下命令获取Namecoin交易ID和地址的详细信息：

以下屏幕截图显示了运行上述命令的输出：

另外，我们还可以检查RPC接口（使用namecoin.conf中的rpcuser和rpcpassword）：

现在，我们将使用curl命令访问[http://127.0.0.1:8336来获取有关的Web信息内容：](http://127.0.0.1:8336%E6%9D%A5%E8%8E%B7%E5%8F%96%E6%9C%89%E5%85%B3%E7%9A%84Web%E4%BF%A1%E6%81%AF%E5%86%85%E5%AE%B9%EF%BC%9A)

我们可以看到用curl命令访问本地系统内容获得以下输出：

此外，我们可以使用curl命令提取HTTP站点发送给我们的协议头。以下命令存储HTTP站点发送给我们的协议头。此命令将收到的协议头写入指定的文件：

以下屏幕截图显示了运行上述命令的输出：

PowerDNS是开源DNS软件、服务和支持的主要供应商。PowerDNS是一个DNS服务器，源码用C++编写，并在GNU通用公共许可证（GPL）下许可。它运行在大多数Unix衍生产品上。它支持很多不同的后端，从简单的BIND到关系数据库。我们将使用以下命令在系统上安装PowerDNS：

以下屏幕截图显示了运行上述命令的输出：

·配置：我们需要在本地环境中配置PowerDNS。我们命令PowerDNS将.bit、.eth和.p2p域名的请求发送到端口5333。

此配置在/etc/powerdns/recursor.conf文件中指定：

在下面的屏幕截图中，我们可以看到查询的前向区域文件信息：

我们可以在以下屏幕截图中找到127.0.0.1:5333上的前向区域信息：

特别注意我们的前向区域声明。确保使用sudo service pdns-recursor restart在此时重新启动PowerDNS。然后，在我们继续之前确认PowerDNS可以正确解析传统域名：

·验证：要验证前向区域PowerDNS安装，我们需要运行以下命令：

更新apt-get并安装一些依赖包。请注意，当我们安装npm（需要安装Node.js）时，需要安装nodejs-legacy。

·安装依赖项：在此步骤中，我们将安装所有可靠的脚本和命令：

·DNSChain的安装：现在可以使用以下命令执行DNSChain的安装：

在下面的输出中，我们可以得到一些结果，包括获取注册表文件coffee-script-1.12.7.tgz：

·配置：我们需要配置DNSChain以将其绑定到端口5333，或者使用其他任何更大的端口号，只要它与PowerDNS捕获的请求对应的端口号匹配。

这是之前在/etc/powerdns/recursor.conf中指定的。DNSChain的另一个重要特性是我们可以通过HTTP公开查找结果。我们将为此指定端口8000，但你可以使用任何已经开放的更大的端口号。DNSChain可以设置为由Web服务器访问，例如通过端口8000。对于这个例子，写入到/home/ubuntu/.dnschain/dnschain.conf：

我们需要为DNSChain创建另一个upstart文件，并将此文件写入/etc/init/dnschain.conf：

我们现在将运行sudo initctl reload-configuration，然后重启机器。最后，让我们通过尝试解析.bit域名来测试它。

可能需要等到更多区块链信息被加载才能运行。

·验证：最后，我们可以通过访问hello.bit地址来验证DNSChain。在输出结果中，我们可以找到服务器51.101.1.6所需IP地址的结果：

区块链的DDoS防御平台，首先需要使用以太坊区块链的Node.js和Truffle来准备测试环境。我们将使用一个现有的区块链项目来保护网络免受DDoS攻击。该项目可以在链接[https://github.com/gladiusio/gladius-contracts下找到。](https://github.com/gladiusio/gladius-contracts%E4%B8%8B%E6%89%BE%E5%88%B0%E3%80%82)

我们需要按照以下步骤为Gladius项目准备基础设施：

1）首先，我们将在系统环境中安装Node.js，链接地址为[https://nodejs.org/uk/download/package-manager/#arch-linux。](https://nodejs.org/uk/download/package-manager/#arch-linux%E3%80%82)

2）我们需要在测试环境中安装truffle：

3）在命令行中执行如下命令：

4）现在在命令行中执行如下命令来启动测试网络：

以下屏幕截图显示了运行上述命令的输出内容：

5）在此终端窗口中，我们可以看到测试区块链网络中的所有交易。现在，我们必须打开一个新的终端窗口，并需要跳转到工作目录。

要进行项目配置，请按照以下说明操作：

1）在[https://github.com/gladiusio/gladius-contracts网页中找到.zip文件并下载，然后将文件解压到你指定的路径。](https://github.com/gladiusio/gladius-contracts%E7%BD%91%E9%A1%B5%E4%B8%AD%E6%89%BE%E5%88%B0.zip%E6%96%87%E4%BB%B6%E5%B9%B6%E4%B8%8B%E8%BD%BD%EF%BC%8C%E7%84%B6%E5%90%8E%E5%B0%86%E6%96%87%E4%BB%B6%E8%A7%A3%E5%8E%8B%E5%88%B0%E4%BD%A0%E6%8C%87%E5%AE%9A%E7%9A%84%E8%B7%AF%E5%BE%84%E3%80%82)

2）用下面的代码替换truffle.js里的代码：

3）我们将进入名称为gladius-contracts-master的文件夹并使用以下命令编译合约：

以下屏幕截图显示了运行上述命令的输出内容：

4）现在，我们可以执行下面的命令将合约发布到ganache-cli的本地区块链上：

以下屏幕截图显示了运行上述命令的输出内容：

5）现在，我们必须使用truffle test命令启动单元测试，以确保智能合约正常运行：

6）在[https://github.com/gladiusio/gladius-control-daemon网页中下载.zip文件，然后将其解压缩到与gladius-contracts相同的文件夹中。](https://github.com/gladiusio/gladius-control-daemon%E7%BD%91%E9%A1%B5%E4%B8%AD%E4%B8%8B%E8%BD%BD.zip%E6%96%87%E4%BB%B6%EF%BC%8C%E7%84%B6%E5%90%8E%E5%B0%86%E5%85%B6%E8%A7%A3%E5%8E%8B%E7%BC%A9%E5%88%B0%E4%B8%8Egladius-contracts%E7%9B%B8%E5%90%8C%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%AD%E3%80%82)

7）接下来，我们在终端中找到gladius-control-daemon-master文件夹并链接合约应用程序二进制接口（ABI）。ABI是两个程序模块之间的接口，其中一个程序模块位于机器代码级别：

以下屏幕截图显示了运行上述命命令的输出内容：

8）下一步，我们可以执行npm install命令安装所需依赖：

9）然后，我们可以执行node index.js命令启动脚本：

10）打开一个新终端窗口，执行gladius-networkd命令：

11）下一步，我们需要再打开一个新的终端，执行gladius-controld命令：

12）为了启动你的节点，你需要在新终端中执行下面的命令：

以下屏幕截图显示了运行上述命令的输出内容：

13）我们可以将数据提交到特定的池，允许它接受或拒绝成为池的一部分：

14）完成节点创建后，我们可以使用管理应用程序检查它的状态。这显示了区块链中的节点信息：

现在只需将Gladius客户端下载到你的计算机并访问系统即可。

激活Gladius后，所有节点都会处理连续的请求流，以校验网站连接并阻止恶意活动。Gladius积极致力于解决系统中的若干问题并实现稳定的系统。

智能合约协同DDoS解决方案的基于区块链的架构的链接地址为[https://www.springer.com/cda/content/document/cda\_downloaddocument/9783319607733-c2.pdf?SGWID=0-0-45-1609389-p180909480。](https://www.springer.com/cda/content/document/cda_downloaddocument/9783319607733-c2.pdf?SGWID=0-0-45-1609389-p180909480%E3%80%82)

·基于区块链的协同DDoS解决方案的链接地址为[https://files.ifi.uzh.ch/CSG/staff/Rafati/Jonathan%20Burger-BA.pdf。](https://files.ifi.uzh.ch/CSG/staff/Rafati/Jonathan%20Burger-BA.pdf%E3%80%82)

Karl Wust和Arthur Gervais决策路径模型的更多信息，请访问链接[https://eprint.iacr.org/2017/375.pdf。](https://eprint.iacr.org/2017/375.pdf%E3%80%82)

![](https://storage.googleapis.com/papyrus_images/4b2e36ba8c879e7000f129c395408f33b61939c69b81c5bb10d66211c42065b9.png)

Kerberos – 中心化认证/授权范式
=====================

个例子说明。当我们进行登录时，需要将`Username`和`Password`传输到服务端，服务端根据用户名找到用户信息后，再核对密码是否正确，核对正确以后，给用户颁发一个`UserToken`，作为今后用户使用系统的临时凭据。而在Kerberos登录过程中，用户将`Username`和`Password`输入到登录界面中，客户端只是将`Username`传送到服务端，服务端找到用户信息以后，直接给用户一个`UserToken`，但这个`UserToken`是用用户的`Password`加密的。因此，如果用户想得到这个`UserToken`，那么，用户必须输入正确的`Password`才能解开。也就是说，当用户输入错误的`Password`时，他无法得到`UserToken`，就无法完成登录使用系统。当输入正确的`Password`时，他就得到了`UserToken`，可以使用系统。

在Kerberos认证协议中，大量使用了这种方式和思想。这种方式的好处就是，用户的`Password`不会在网络上传输，并且层层的加密保证了系统即使在一个非安全的网络（可能被监听）中也不会泄露信息个例子说明。

![](https://storage.googleapis.com/papyrus_images/465c31b3a354562a257e1a5ca723fb3111c3d40a0f77fb318f981b71e8884bdb.png)

当我们进行登录时，需要将`Username`和`Password`传输到服务端，服务端根据用户名找到用户信息后，再核对密码是否正确，核对正确以后，给用户颁发一个`UserToken`，作为今后用户使用系统的临时凭据。 而在Kerberos登录过程中，用户将`Username`和`Password`输入到登录界面中，客户端只是将`Username`传送到服务端，服务端找到用户信息以后，直接给用户一个`UserToken`，但这个`UserToken`是用用户的`Password`加密的。因此，如果用户想得到这个`UserToken`，那么，用户必须输入正确的`Password`才能解开。 也就是说，当用户输入错误的`Password`时，他无法得到`UserToken`，就无法完成登录使用系统。当输入正确的`Password`时，他就得到了`UserToken`，可以使用系统。 在Kerberos认证协议中，大量使用了这种方式和思想。这种方式的好处就是，用户的`Password`不会在网络上传输，并且层层的加密保证了系统即使在一个非安全的网络（可能被监听）中也不会泄露信息

为了在中文中醒目，客户端用`Client`表示，认证中心用`TGS`表示，后端服务器用`Service`表示，其他变量尽可能用英文表示。

    【被加密的内容】(加密密钥)
    

为了在中文中醒目，客户端用`Client`表示，认证中心用`TGS`表示，后端服务器用`Service`表示，其他变量尽可能用英文表示。

用户认证过程如下：

*   用户输入`Username`和`Password`后，`Client`将`Username`发送到TGS；
    
*   `TGS`根据`Username`找出用户信息，取出`Password`，返回两条消息
    

    消息1
    Client与TGS之间通信的密钥: "Client/TGS SessionKey"
    【以上内容用"Password"加密】
    

    消息2 "TGT"
    "Client/TGS SessionKey"(与上条消息的Client/TGS SessionKey相同), "UserID", "UserIP", "Expires"
    【以上内容用TGS自己的服务密钥"TGS's SecretKey"加密】
    

消息2 "TGT" "Client/TGS SessionKey"(与上条消息的Client/TGS SessionKey相同), "UserID", "UserIP", "Expires" 【以上内容用TGS自己的服务密钥"TGS's SecretKey"加密】

    1. "Client/TGS SessionKey" 原文
    2. "TGT" 密文
    

11."c1ient/TGs5 essionKey"原文 22."TGT"密文 33."Client-Service Ticket"密文 44."Client/Service SessionKey"原文 3

服务请求 client发送如下两条消息给

    消息1
    "Client-Service Ticket"
    【记住该内容是"TGS"用"Service's SecretKey"加密的】
    

    消息2 "Authenticator":
    "UserID", "Timestrap"
    【以上内容用"Client/Service SessionKey"加密】
    

*   `Service`收到后，作如下处理
    
    *   用`Service's SecretKey`解开`Client-Service Ticket`得到`Client/Service SessionKey`, `UserID`, `UserIP`, `Expires`
        
    *   用`Client/Service SessionKey`解开`Authenticator`得到`UserID, Timestrap`
        
    *   验证`Client-Service Ticket`和`Authenticator`，如是否过期，两者包含的`UserID`是否相同等
        
*   当以上消息均验证成功后，`Service`开始信任`Client`，返回如下消息：
    

    "欢迎信息"
    【以上内容用"Client/Service SessionKey"加密】
    
    

![](https://storage.googleapis.com/papyrus_images/987bbdfcc74ef9e02a6ba636bd30f7f503fb8a0ed47ed34c210c03d486116049.png)

PKI – 基于非对称加密公钥系统的认证范式
======================

PKI – 基于非对称加密公钥系统的认证范式

能够更有效地运用[公钥](https://so.csdn.net/so/search?q=%E5%85%AC%E9%92%A5&spm=1001.2101.3001.7020)而制定的一系列规范和规格的总称，这是一种广泛的定义，但是往往在论文中指定一个特定的形式也就是下面所讲的形式，但是这种形式也是一种总称

注意：

1.  下面模型都是基于身份的认证协议的PKI，这是一种特定的PKI模型；但实质上PKI是广义的，只要是为了解决公钥密码体制而建立的一套机制都可以统称为PKI，所以我们目的并不是讲全一个PKI，其旨在于通过其让你明白大致的PKI应该是个什么样的模型。
    
2.  用户向认证机构进行注册，**认证机构生成公私钥的话，认证机构肯定也会将私钥发送给用户**，但是如果是用户自己生成公私钥的话就不用认证机构进行发送；所以当别人申请下载证书的时候，认证机构就会发放对应的公钥。
    

![](https://storage.googleapis.com/papyrus_images/627869844028f2c77badb486f7b93eb85b9447d83f202316f3088545122bbab1.png)

1.  生成秘钥对，有两种方式：
    
    1.  PKI用户自行生成；
        
    2.  认证机构来生成，这种方式认证机构就需要把私钥发送给用户；
        
2.  注册证书：
    
    1.  如果是PKI用户自行生成秘钥对，那么它在这个阶段就会请求认证机构生成证书
        
3.  作废证书以及CRL
    
    1.  当用户的私钥丢失、被盗的时候，认证机构需要对证书进行作废，注意：此时即使秘钥安全无恙也是需要对证书进行作废，因为存在潜在的威胁，你无法去做出一个肯定的判断；
        
    2.  需要制作一张证书作废清单CRL，并且对这个清单加上数字签名；
        
    3.  **查询**：用户需要从认证机构获取最新的CRL，并查询自己要用于验证签名（或用于加密）的公钥是否作废。
        

![](https://storage.googleapis.com/papyrus_images/2738bf4ef364ec74ade062c418a7d00fc8f5246a4a5a065a81fb63df2a429536.png)

![](https://storage.googleapis.com/papyrus_images/540391879894329e5cafa805eefea20431fc5eab63894bf5eb7812c9ae14fbdb.png)

基于PKI的不可抵赖性 – 数字签名范式
====================

PKI是[公钥](https://so.csdn.net/so/search?q=%E5%85%AC%E9%92%A5&spm=1001.2101.3001.7020)基础设施Public Key Infrastructure的缩写，来了解一下PKI体系中中常见的概念和使用数字签名为何能够防止篡改的原理。

*   CA（Certification Authority）：权威机构和公信机构，用于颁发证书
    
*   CA证书：CA颁发的证书，一般收费（注意在不同的说明习惯中区分由CA颁发的证书和CA自身的证书）
    
*   自签名证书：使用OpenSSL或者CFSSL等方式创建的用户自行签发的证书，签发者和拥有者相同
    
*   密钥：用来加密和解密的字符串和文件，比如RSA密钥的普通长度为2048位
    
*   非对称加密算法：加密和解密使用不同密钥，密钥根据使用特点成对出现，分公钥和私钥
    
*   证书格式：一般为证书编码格式（PEM： Privacy Enhanced Mail），PEM为base64编码的二进制内容，DER为二进制内容
    
*   CSR证书签名请求：向CA机构申请数字签名证书时使用的请求文件，CSR文件需要保留，当证书过期是使用相同的CSR申请新的证书，key可以保持不变
    
*   数字签名：通过非对称加密算法和MD5、SHA256等消息摘要算法对数据进行签名，用于表明身份以及防止篡改。
    

发送方操作
=====

发送方主要准备如下内容： 待发送的数据 使用某种消息摘要算法对待发送的数据进行运算获取的特定长度的消息摘要，可以理解为数字指纹，是对待发送数据的身份验证 准备一对非对称密钥：私钥必须发送方自行严格保管，这是安全的重中之重。公钥则可以公开的形式进行分享，需要注意的是这也是 安全的原则之一，需要保证用户能够获取真正的公钥。

签名：使用私钥对数字指纹进行加密，加密后的指纹就是发送方的签名，使用公钥可以获取此数字指纹内容 然后，发送方就可以将数据和签名在网络上发送了

接收方操作
=====

接收方从网络上获取传输的数据和签名，然后以安全的方式获取发送方的公钥。然后顺次做如下事情就可以确认数据是否被算改了：

使用公钥对签名进行解密，获取数据的数字指纹 使用相同的摘要算法对数据进行运算，获取消息摘要 如果自行计算获取的消息摘要和通过使用公钥对签名解密获取的数字指纹一致，则能证明此内容未经其他人所算改。

常见风险
====

即使使用上述操作，仍然有被其他人所算改的风险，只要如下内容一旦攻破，所谓的安全也只是形同虚设。 ·接收方使用的公钥必须要和发送方进行严格确认，以保证此证书并非被别有居心的中间人所替换 ·发送者的私钥必须严格保护，绝对避免泄露，这是身份的标识。 比如一旦发送者的私钥被泄漏，中间人只需要以网络攻击的方式替换发给接收方的内容即可，基本可随意操作，因为拥有发送方私钥的他 基本上就等同与发送方。 另外也可以从接收方下手，如果接收方使用的是中间人所替代的自己的公钥，辅以替换发给接收方的内容，使用自己的私钥和算改的数据 进行签名，自然一点问题都没有。 在实际的场景中，还是后一种的风险一般更大，所以从接收方而言，确认使用的证书的有效性和安全性非常重要，所以这也是CA机构存 在的重要原因，而使用自签名证书的情况下，保证接收方使用的公钥的正确性则是实际使用中所需要注意的。

![](https://storage.googleapis.com/papyrus_images/b55415b307f135615c301674aa284eea755dc20b2c966c673deeb385146f6afd.png)

可信计算 （Trusted Computing）范式 -方案
==============================

![](https://storage.googleapis.com/papyrus_images/70f6d2285dd785a747fc5e7f282f5e7141c0865564647e9597a24955f12c8e29.png)

**传统防御系统**：主要由防火墙、入侵检测、病毒防范等组成。这种封堵法是捕捉黑客攻击和病毒入侵的特征信息，属于“事后防御”，缺少对访问者源端的控制。

**可信计算(Trusted Computing)**，是一种基于密码的运算与防护并存的计算机体系安全技术，保证全程可检测可监控。可信计算的原理是出击，整个链路都经过可信认证，所以无论从应用、操作系统还是硬件，必须经过授权才能使用，这无疑降低了病毒、网络攻击的概率。包括5个关键技术概念：认证密钥，安全输入输出，内容屏蔽/受保护执行，封装存储，远程证明。 

![](https://storage.googleapis.com/papyrus_images/1ebf2d231b5b9c5b68432ef298972f3bca96bef4f320b769b4e95d4c446c0823.png)

在等保一到四级都有可信的要求，主要在三个领域：计算环境可信、网络可信、接入可信。

![](https://storage.googleapis.com/papyrus_images/b6c13a9d49c31bd2095a9c97f582244d66615896bdc3e0b2c88025691e407c1b.png)

附：名词解释
======

PM（Trusted Platform Module）：可信平台模块芯片，以安全保密功能为特色的嵌入式计算系统。 TSS（TCG Software Stack）: 可信软件栈，是可信计算平台上TPM的支撑软件。 TNC（Trusted Network Connect）：可信网络连接技术。 PCR（Platform configuration register）：平台配置寄存器，用于存储可信任度量值，验证平台完整性以及保护数据。 NGSCB（Next-Generation Secure Computing Base）：安全运算平台，利用软件和硬件提高PC的安全性以及通过加密数据的数据登陆设备阻止攻击。 RAM（random access memory）: 随机存储器（内存）。 TPCM（Trusted Platform Control Module）: 可信平台控制模块，让可信平台模块具有对平台资源进行控制的功能。 TCPA/TCG（Trusted Computing Platform Alliance/Trusted Computing Group）：可信计算平台联盟/可信计算工作组。 BIOS（Basic Input Output System）: 基本输入输出系统，为计算机提供最底层的、最直接的硬件设置和控制。 PMBR（Pre-MBR）: 是一个二进制程序，可以用来度量内核和基本服务模块的完整性。 ECC(Elliptic Curves Cipher)：椭圆曲线密码体制，是基于椭圆曲线数学的一种公钥密码的方法。 TLS（Transport Layer Security）:  安全传输层协议，用于在两个通信应用程序之间提供保密性和数据完整性。 TCM（Trusted Cryptography Module）：可信密码模块，是可信计算平台的硬件模块，为可信计算平台提供密码运算功能。 RTM（Root of Trust for Measurement）: 可信度量根，是对平台进行可信度量的基点。 TRM（Trusted Reference Monitor）：可信引用监视器。

分布式安全 – 规则决策/规范执行分离范式
=====================

![](https://storage.googleapis.com/papyrus_images/e2f82d329278dd74de527016510222712795b5dd67d0cb79c84163103a658cbb.png)

(1)对称加密

对称加密是指的加密和解密使用相同密钥的加密算法。在加密算法中使用了同一个密钥，A进行密钥加密，B用相同的ky进行解密。 这就需要A和B对key进行相当的保密，倘若被别人发现密钥k©y的值，信息就会被暴露。

(2)非对称加密

(yub-key)A->B(pri-key) 非对称加密就是针对上面对称加密的安全措施的缺陷来进行的整改，为了防止别人拿到ky值就可以肆意的进行数据传输，那么B就 可以向外提供一个公钥(pub-key),这个时候，A发过来的消息使用(pub-key)进行加密，而对于拥有私钥的B来说才能解开。并且这 还有个显著地特点，就是如果B可以向外发出很多个公钥，如果这几个公钥不一样，那么另外这几个公钥发过来的消息他们彼此是不能相 互通信的。这就进一步加强了数据的安全性。 非对称加密要求加密一方和解密一方密钥不同，但是他的性能太低。

(3)数字签名 (sign)A-->B (pub) 非对称幼加密对加密性能进行了提高，然而我们还是要担心的问题就是公钥是不是被人拦截了，被人从中获取之后，修改信息。所以我 们引进里数字签名，这个时候，A生成了一对公钥和私钥，先将公钥给B,然后自己的数据用私钥进行签名，发送给B,B接收到消息之 后，用八发过来的数据解密，就能获得数据。

(4)数字认证

![](https://storage.googleapis.com/papyrus_images/53e3c887244214a08f1d2e0595abe29f29a471399b0a2cda79caa400019e58d8.png)

---

*Originally published on [leaf](https://paragraph.com/@leaf-6/XKGCmSORF0GnFTR03ent)*
