Hyperledger Fabric 国密改造项目介绍
有关bccsp的改造方案的RFC文档
Fabric国密改造项目由Hyperlegder中国工作组(TWGC)发起执行,旨在构建支持国密算法且密码算法可灵活扩展的Fabric平台,方便世界各国开发者快速接入自定义的密码算法。
根据改造需求分析,Fabric国密改造方案由三个部分构成:
国密算法基础库收集与改造
构建完善可用的国密算法基础库是Fabric国密改造的首要事项。本次改造涉及的国密算法包括:SM2、SM3和SM4。另外,TLS协议也需要进行对应的国密改造。
- 北京大学信息安全实验室 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)
Fabric本体改造
Fabric本体改造包括:Fabirc改造和Fabric-CA改造,主要是重构Fabric密码套件接入方式,以便开发者灵活接入自定义的密码算法。完成对Fabric的国密算法接入改造,主要涉及国密算法的Golang实现以及改造出符合国密标准的TLS通信加密组件。
Fabric SDK改造
Fabric SDK改造包括:Fabric客户端SDK改造,这部分涉及的语言分别是Golang、NodeJS和Java。当Fabric的国密改造完成时,对应的客户端程序中部分涉及加密学的部分也需要进行国密改造以适配Fabric网络的国密PKI体系。
- java-gm (https://github.com/Hyperledger-TWGC/java-gm)
- node-gm (https://github.com/Hyperledger-TWGC/node-gm)
BCCSP
我们现在在 Hyperledger-TWGC github 组织下拥有 3 个中国加密库流。
其中一些还提供了成功的、经过企业验证的 bccsp 实现。
但是随着我们深入了解结构源,我们注意到仅实现 bccsp 并不能满足中国国家加密规范的所有要求。
bccsp之外还有一些cypro库的使用,比如通讯协议,X509格式转换。
Fabric 核心与 x509 标准非常非常紧密地结合在一起:
所有通信都假设 TLS 使用 x509 并且没有可插拔算法(不过,可以分叉 TLS 库并制作您自己的版本)。
Fabric 身份验证基础结构使用 BCCSP MSP,它也很大程度上基于 x509,并没有以任何方式将其抽象出来。
彻底检查整个代码库以抽象出 x509 将需要大量工作,如果我们这样做,它将使向后移植更改和错误修复变得痛苦,因为代码库会分歧太多。
国密改造目标
- 采用规范的非入侵式的改造设计,希望国密改造能够与Fabric升级持续兼容;
- 开发支持多语言且完善的国密库和通讯套件;
- 实现Fabric-SDK多语言的国密改造;
MSP
目前,Hyperledger Fabric支持FABRIC类型和IDEMIX类型两种MSP组件,默认采用基于BCCSP组件构建的FABRIC类型MSP组件
localMspType: bccsp # MSP类型, 目前支持bccsp或idemix
- BCCSP类型: Fabric默认类型
- IDEMIX类型: Fabric 1.3中还增加了IDEMIX类型的MSP组件,采用了零知识证明的方法以提供身份验证与隐私保护功能(http://eprint.iacr.org/2016/663.pdf),这使得在不披露被验证者身份信息的情况下,向验证方证明自己的合法身份并完成交易,具有不可链接性(linkability),即无法从单个身份执行的多个交易中分析出是由同一个身份实体提交的,以实现真正意义上的匿名隐私保护特性,同时,提供Fabric CA(1.3以上版本,适用于生产环境)与idemixgen工具(适用于开发环境)作为发行者(Issuer)创建配置文件,为用户提供凭证(credential)。
Other
common.InitCrypto()函数首先调用SetBCCSPKeystorePath()函数,获取Viper组件配置中BCCSP组件密钥存储文件的路径(peer.BCCSP.SW.FileKeyStore.KeyStore配置项),转换为绝对路径后设置该配置项
调用creator.Verify()方法获取哈希方法及消息摘要(哈希值),通过所属MSP组件的BCCSP加密安全组件调用id.msp.bccsp.Verify()方法,验证消息签名的真实性。
然后,调用creator.Validate()→bccspmsp.validateIdentity()方法,验证该证书的有效性(7.2.1节),即是否满足证书符合X.509标准、证书不属于CRL、证书组织单元OU字段与MSP组织单元有交集等要求。
然后,执行identity.SatisfiesPrincipal(signedByID)→bccspmsp.SatisfiesPrincipal()方法,验证该签名身份实体信息identity是否满足指定签名策略的Principal结构对象要求。
defaultBCCSP对象的Setup()方法基于参数解析出MSP组件配置对象(FabricMSP-Config类型),将其作为参数传递给内部构建方法(即bccspmsp.setupV1()方法)执行调用,并依次调用msp.preSetupV1()方法和msp.postSetupV1()方法初始化本地MSP组件,
(10)bccsp节点bccsp节点包含了加密算法相关的配置,在bccsp节点中可以选择相关的加密算法以及相关加密算法的证书文件。bccsp节点的配置信息如下所示:
- 往期精彩回顾:
- 区块链知识系列
- 密码学系列
- 零知识证明系列
- 共识系列
- 公链调研系列
- BTC系列
- 以太坊系列
- EOS系列
- Filecoin系列
- 联盟链系列
- Fabric系列
- 智能合约系列
- Token系列