超级账本 Fabric 项目自 1.1 版本开始,关于增强通道内隐私保护的新特性引发不少讨论,如 FAB-1151、 FAB-2961、 FAB-4976、FAB-8718。本文将总结该特性设计过程和来龙去脉,以供后续开发者更好地理解最初的设计意图和核心思想。
超级账本 Fabric 1.x 系列版本中在增强隐私性方面做了很大改进,1.0 版本中一个重要特性就是多通道(Multiple-channel)的支持。使用该特性,账本网络中若干成员可以协商构建一个专属通道与外部隔离,通道外的节点无法看到其中的账本和交易数据,极大地提高了隐私性。
然而,在有些场景下单纯使用通道来保护数据安全仍然存在不足:
总之,需要一些更灵活的方案,来实现更细粒度的数据安全保护。
首先来看下,当前 Fabric 对交易的处理流程中,哪些环节有可能进一步改进隐私性。
首先来看相对独立的排序环节。
为了避免排序服务看到明文交易数据,很自然地,可以将交易数据提前进行保护处理,让排序服务只拿到处理后的结果。但这个结果对于授权的部分节点来说,必须还要能对应回原先的交易数据,不然无法完成最终的提交操作。
最基本的两种手段是加密和 Hash,主要的差异如下表所示。
比较 | 加密处理 | Hash 处理 |
---|---|---|
恢复 | 可以恢复 | 理论上无法恢复 |
额外数据(如密钥) | 需要密钥加密 | 无需(加盐除外) |
破解 | 算法保证,一般较难破解 | 理论上除了穷举碰撞很难破解 |
无论是哪种方案,都可以保证排序服务无法直接看到交易明文。从安全性上来看,采用 Hash 方法会更难破解。
注意:简单 Hash 机制无法抵挡基于统计的破解,但实现中很容易通过结合加盐或 HMAC 等机制来提高抗破解强度。
思考:实际上,映射表机制也可以满足增强排序环节隐私性的需求,然而需要额外维护和存放表结构,并不比 Hash 机制更加安全。
由于在背书过程,Peer 节点需要通过提案计算读写集,并通过签名证实背书通过,这意味着:
下面分别讨论采用加密或 Hash 机制。
采用加密机制,客户端发送明文的提案给背书 Peer,背书 Peer 验证后执行提案,获得结果读写集,对读写集使用某个密钥加密,签名并返回客户端。客户端要比对不同的背书结果,因此,要么能解密所有的响应结果(难实现),要么所有背书节点采用同一密钥加密(意味着密钥需要由客户端产生)。
注意只有授权的 Peer 节点可以访问明文读写集(彼此通过 Gossip 传播),并最终提交结果到本地的私有状态数据库。
整个过程中最关键的还是密钥的分发和管理。
为了提高安全性,客户端可以将加密密钥通过授权 Peer 的公钥进行加密后再传播;为了避免关联性,客户端可以对于不同的交易采用不同的密钥,当然这会增加网络中加解密处理的计算量。授权 Peer 节点之间可以通过某种方式(如 Gossip)主动进行组内的密钥分发。
一个不太好解决的问题是,交易处理完成后,密钥是否需要保存?如果保存,可能将来会造成泄露;如果不保存,后来授权的 Peer 可能无法根据公开的区块链结构同步结果到私有状态数据库。另外,保存在客户端还是 Peer 节点。这些都是比较难解决的问题。
采用 Hash 机制,客户端发送明文的提案给背书 Peer,背书 Peer 验证后执行提案,获得结果读写集,对读写集计算 Hash 值,签名并返回客户端。
在这个过程中,只要背书节点的 Hash 过程一致,对于相同读写集,客户端可以容易验证结果的一致性。
同样,明文读写集可以通过 Gossip 传播在授权组内传播。
这也是 1.1 版本开始支持的 sideDB 特性的基本实现思路。
提交环节需要将读写集内容写到本地状态数据库,并记录交易到区块链结构中。因此,对于授权组内节点来说必须要能获知明文的读写集。
sideDB 中除了新的私有状态数据库、私有区块链结构之外,还额外创建一个临时的本地私有数据库,保存在背书环节中读写集明文以及到对应 Hash 值之间的映射关系。当对应交易提交时,将读写集明文内容更新到私有的状态数据库和区块链结构中,将 Hash 后的交易更新到公共结构中。
授权组是静态情况下,可以通过对链码进行实例化时指定;当授权组需要支持动态增删时,则要复杂的多。
一个典型的问题是,是否允许新加入的节点访问之前的私有数据?
另外,授权组的策略如何在网络中同步?如何保证 Peer 能拿到最新的授权策略,而不至于将私有数据发给了过期的邻居?
这些都是一些开放的问题,预计将在 1.2 版本中初步解决。
超级账本 Fabric 引入了 sideDB 机制,通过 Hash 处理和私有数据结构,在通道内部实现了更细粒度的隐私保护。Hash 后的交易内容仍然会发送到排序节点,并提交到公共的数据库和账本结构中。而授权组的 Peer 节点则在本地维护私有的状态数据库和区块链结构,保存交易的明文内容。这就保证了通道内其他节点无法看到授权组的交易内容。