会议介绍
2020年12月5日,第一次参加线下成都区域的线下见面会,此次见面会中,嘉宾分享了“货信云动产数字化和管理一体化的解决方案”、“从区块链到空间区块链”、“Hyperledger Fabric RAFT共识算法重构”、“TWGC国密化改造介绍”。对我(技术人)而言,比较更感兴趣的是后两者。
中国网安区块链研发中心平台研发负责人分享了RAFT共识算法重构这一主题,介绍了
“Hyperledger Fabric在其1.4版本中正式发布了etcdraft共识算法,为广大fabric用户提供了更多的共识算法选择。但在对etcdraft共识算法进行深入分析后,发现其在对raft共识算法进行工程化实现仍有一些不合理的地方。由于Fabric 1.4的etcdraft共识算法直接使用了etcd的共识库,导致orderer节点上实质运行了2套日志系统,造成磁盘IO与存储空间的双倍消耗,极大地影响了系统性能并浪费了大量的存储空间。针对上述问题,提出了一个完整的,安全高效的raft方案,对Fabric etcdraft共识算法进行了大规模重构,使其满足更高的安全与性能需求。”
中国网安技术经理分享了Fabric国密改造这一主题,分享了
“Hyperledger Fabric项目,根据中国的政策要求,需要支持国密算法。超级账本中国技术工作组(TWGC)在现阶段对国密改造的进度与成果,如何加入TWGC等做了详细的介绍”。
我理解的国密改造
受业界白皮书影响,一直认为在区块链技术架构中的加密模块中提供相应的国密算法(如SM2\SM3\SM4等)工具类即可。通过对TWGC国密改造内容的介绍,才发现不仅包含国密算法工具类,还包括对TLS和gRPC进行改造,gRPC需要支持国密证书的解析和通信协议适配。不仅要求国密算法本身的实现,而且要满足与其他语言实现的国密库的互操作性。例如,SM2非对称加密算法,对于数据M,利用Java实现的SM2加密,能够使用Go语言实现的SM2成功解密。
国密算法是国家通用密码算法的简称,是国家密码管理局制定的自主可控的国产算法,包括SM1、SM2、SM3、SM4、SM7、SM9、祖冲之密码算法(ZUC)等。密码算法在区块链系统中起着举足轻重的作用,这对于国内所有的联盟链,以及Hyperledger Fabric来说也不例外。特别是Government和Bank这些大客户更热衷于国密的支持。
Hyperlegder Fabric国密改造方案设计
Hyperlegder Fabric项目主要包括三个部分:Fabric、Fabric-CA和Fabric SDK。根据改造需求分析,Fabric国密改造方案由三个部分构成:
(1)国密算法基础库收集与改造
构建完善可用的国密算法基础库是Fabric国密改造的首要事项。本次改造涉及的国密算法包括:SM2、SM3和SM4。另外,TLS协议也需要进行对应的国密改造。
实现国密算法的编程语言包括:Golang、NodeJS和Java,各语言实现的国密算法之间需要进行互操作验证。
国密算法基础库的构建有两个途径:
- 收集已有的国密算法开源实现项目,最终收集并审核加入的成熟基础库。
- 北京大学信息安全实验室 GMSSL 系列
- 中国网安 CCS-GM 系列
- 苏州同济区块链研究院 tjfoc-gm
- 自己实现的国密算法。
- java-gm
- node-gm
(2)Fabric本体改造
Fabric本体改造包括:Fabirc改造和Fabric-CA改造,主要是重构Fabric密码套件接入方式,以便开发者灵活接入自定义的密码算法。完成对Fabric的国密算法接入改造,主要涉及国密算法的Golang实现以及改造出符合国密标准的TLS通信加密组件。
(3)Fabric SDK改造
Fabric SDK改造包括:Fabric客户端SDK改造,这部分涉及的语言分别是Golang、NodeJS和Java。当Fabric的国密改造完成时,对应的客户端程序中部分涉及加密学的部分也需要进行国密改造以适配Fabric网络的国密PKI体系。
按上述方案来看,Fabric国密改造的实施路径,也给我们提供了一种国密改造的技术思路。
目前项目进度
基于上述改造方案,改造项目实施路线分为两个阶段:准备阶段(已完成)、实施阶段、整理阶段。
(1)实施阶段 实施阶段是方案落实执行阶段,主要涉及项目管理工作,包括:执行跟踪和测试验收。
- 执行跟踪:通过周例会的形式,国密改造小组同步各个项目的进展情况,并就执行过程中存在的问题进行分析讨论。
国密基础库 | SM2 | SM3 | SM4 | TLS |
---|---|---|---|---|
北大国密库 | 成熟 | 成熟 | 成熟 | |
网安国密库 | 成熟 | 成熟 | 成熟 | 孵化 |
同济国密库 | 成熟 | 成熟 | 成熟 | |
Java国密库 | beta | beta | beta | 孵化 |
NodeJS国密库 | beta | 孵化 |
成熟:可以使用,并且包含了项目内部单元测试和互操作测试。
beta:功能待完善,开发过程中。
孵化:调研中。
测试验收:Fabric国密改造联调测试,主要是各语言SDK与Fabric、Fabric-CA的联调测试。
(2)整理阶段 整理阶段主要复盘国密改造的整体工作,整理开发文档和迁移兼容指南,为对Fabric国密的开发者用户提供详细准确的参考。
个人觉得该项目有趣的是,除了国密社区多样化(多语言种类、多密码技术实现)的实现方式和开源的贡献,更有意思的是互操作认证。
Hyperledger Fabric的项目是多方参与的区块链解决方案,由于国密算法是一套标准,而在实际实施过程中,可能会有不同的实现方式。比如Fabric其本身基于Golang语言,使用Golang实现的国密算法,而应用端使用Java或NodeJS等其他语言实现的国密算法。为了解决这个问题,国密工作组基于不同语言国密算法实现密钥可以交叉验证的宗旨,创建了fabric-gm-plugins这个工程来确保不同语言之间的国密算法基础库之间可以进行互操作。同时,对于各个项目库内部的测试,接口与文档规范也有一定的要求,比如在Golang的实现库中覆盖了有关性能的benchMark测试案例。
更多更详细的资料,可查看Fabric-GM-wiki:https://github.com/Hyperledger-TWGC/fabric-gm-wiki
安全传输层协议TLS
TLS协议有三个作用:验证,防篡改,加密。这三个作用也基本上是密码学相关的三个应用。验证是可以同时支持客户端验证服务端和服务端验证客户端两个需求的,只是在大部分的Client-Server应用场景下,都是客户端验证服务端即可,主要目的是为了防止网站伪造,防钓鱼网站的目的。防篡改的主要密码学方法是哈希算法,各个版本的SSL/TLS握手应用了大量的不同的哈希算法。加密在TLS中有两个主要的体现,一个是握手的过程中的非对称加密用以建立信道,一个信道建立之后的对称加密用于实际的通信。之所以分为两个是因为对称加密在功能上不同完成非对称加密的密钥协商的功能,而非对称加密在性能上达不到对称加密的数据要求。
密码套件是在SSL/TLS握手过程中用于磋商安全设置的算法的组合。在交换了ClientHello(客户端问候消息)和ServerHello(服务器端问候消息)之后,客户端将发送它所支持的密码套件的优先级列表。然后,服务器使用从列表中选择的密码套件进行响应。也就是说选择使用什么密码学套件的选择权在Server的手里,而Server通常可以通过配置文件指定Server要支持的密码学套件的列表和顺序。
密码套件分为四部分:密钥交换协商协议、身份验证算法、数据加密算法、消息验证算法。密钥交换协商协议,主要有两种DHE、ECDHE。身份验证算法,一般采用非对称加密算法,如RSA、ECDSA。数据加密算法用于信道建立之后的加密传输数据,一般采用对称加密算法AES(加解密效率高)。消息验证算法顾名思义是一种哈希,如SHA256等,用于验证消息的完整性,包括整个握手流程的完整性。
TLS_DHE_RSA_WITH_AES_256_CBC_SHA
是一个密码学套件的标准名字。这里的TLS代表的是TLS协议。WITH是一个分隔,WITH前面的表示的是握手过程所使用的非对称加密方法,包括约定密钥交换协议和身份(证书)验证算法。WITH后面的表示的是加密信道的对称加密方法和用于数据完整性检查的哈希方法。要区别这两个域,必须要首先明白,两个节点之间交换信息和证书本身是两个不同的独立的功能。两个功能都需要使用非对称加密算法。交换信息使用的非对称加密算法是TLS后的第一个单词(DHE),证书使用的非对称加密算法是第二个(RSA)。
例如,以下是TLS v1.2 cipher suites,因此要支持国密SM系列算法就需要对其改造。
TLS_RSA_WITH_NULL_SHA256 NULL-SHA256
TLS_RSA_WITH_AES_128_CBC_SHA256 AES128-SHA256
TLS_RSA_WITH_AES_256_CBC_SHA256 AES256-SHA256
TLS_RSA_WITH_AES_128_GCM_SHA256 AES128-GCM-SHA256
TLS_RSA_WITH_AES_256_GCM_SHA384 AES256-GCM-SHA384
TLS_DH_RSA_WITH_AES_128_CBC_SHA256 DH-RSA-AES128-SHA256
TLS_DH_RSA_WITH_AES_256_CBC_SHA256 DH-RSA-AES256-SHA256
TLS_DH_RSA_WITH_AES_128_GCM_SHA256 DH-RSA-AES128-GCM-SHA256
TLS_DH_RSA_WITH_AES_256_GCM_SHA384 DH-RSA-AES256-GCM-SHA384
TLS_DH_DSS_WITH_AES_128_CBC_SHA256 DH-DSS-AES128-SHA256
TLS_DH_DSS_WITH_AES_256_CBC_SHA256 DH-DSS-AES256-SHA256
TLS_DH_DSS_WITH_AES_128_GCM_SHA256 DH-DSS-AES128-GCM-SHA256
TLS_DH_DSS_WITH_AES_256_GCM_SHA384 DH-DSS-AES256-GCM-SHA384
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 DHE-RSA-AES128-SHA256
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 DHE-RSA-AES256-SHA256
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 DHE-RSA-AES128-GCM-SHA256
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 DHE-RSA-AES256-GCM-SHA384
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 DHE-DSS-AES128-SHA256
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 DHE-DSS-AES256-SHA256
TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 DHE-DSS-AES128-GCM-SHA256
TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 DHE-DSS-AES256-GCM-SHA384
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 ECDH-RSA-AES128-SHA256
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 ECDH-RSA-AES256-SHA384
TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 ECDH-RSA-AES128-GCM-SHA256
TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 ECDH-RSA-AES256-GCM-SHA384
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 ECDH-ECDSA-AES128-SHA256
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 ECDH-ECDSA-AES256-SHA384
TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 ECDH-ECDSA-AES128-GCM-SHA256
TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 ECDH-ECDSA-AES256-GCM-SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 ECDHE-RSA-AES128-SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 ECDHE-RSA-AES256-SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ECDHE-RSA-AES256-GCM-SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 ECDHE-ECDSA-AES128-SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 ECDHE-ECDSA-AES256-SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 ECDHE-ECDSA-AES128-GCM-SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 ECDHE-ECDSA-AES256-GCM-SHA384
TLS_DH_anon_WITH_AES_128_CBC_SHA256 ADH-AES128-SHA256
TLS_DH_anon_WITH_AES_256_CBC_SHA256 ADH-AES256-SHA256
TLS_DH_anon_WITH_AES_128_GCM_SHA256 ADH-AES128-GCM-SHA256
TLS_DH_anon_WITH_AES_256_GCM_SHA384 ADH-AES256-GCM-SHA384
来源https://www.openssl.org/docs/man1.0.2/man1/ciphers.html
重要的链接
链接名称 | 链接信息 |
---|---|
北京大学信息安全实验室GMSSL系列 | https://github.com/Hyperledger-TWGC/pku-gm |
中国网安CCS-GM系列 | https://github.com/Hyperledger-TWGC/ccs-gm |
苏州同济区块链研究院tjfoc-gm | https://github.com/Hyperledger-TWGC/tjfoc-gm |
java-gm | https://github.com/Hyperledger-TWGC/java-gm |
node-gm | https://github.com/Hyperledger-TWGC/node-gm |
TWGC对于《金融分布式账本技术安全规范》的解析(beta版本) | https://docs.qq.com/doc/DV1VMenFiQXBpeFZK |
向Fabric社区提交了有关bccsp的改造方案的RFC文档 | https://github.com/hyperledger/fabric-rfcs/pull/34 |
TWGC Github组织,给国密项目做出代码贡献 | https://github.com/Hyperledger-TWGC |
TWGC在Hyperledger的联系渠道 | https://wiki.hyperledger.org/display/TWGC/Technical+Working+Group+China |
欢迎关注公众号VenusBlockChain,本公众号长期致、区块链技术研究,传播区块链技术和解决方案、区块链应用落地、区块链行业动态等。