Hyperledger Fabric国密改造
Fabric国密改造是个什么概念?我们来思考以下4个问题:
1、为什么偏偏是密码算法?问: 为什么改造Fabric要从密码算法改造入手? 答: 密码是解决网络与信息安全最有效、最可靠、最经济的方式,是维护网络与信息安全的核心技术和基础支撑。而密码算法在区块链系统中起着举足轻重的作用,说是没有密码没有BlockChain也不足为过。密码算法大体分为非对称,对称和哈希散列(摘要算法) 三个大的种类,不同种类的密码算法区块链系统的不同的地方都起到重要作用。 我们主要通过个一个交易流(Transaction Flow)场景来解释整个过程:
1.1、非对称算法的应用场景首先介绍非对称算法的使用场景。非对称算法在Fabric中主要提供签名验签 功能。签名验签工作存在于整个交易过程中,涉及到中间的每个节点。我们来看看整个交易生命周期中,签名验签是怎么发生作用的。
“背书”这个词源来自银行票据业务,是指票据转让时原持有人在票据背面加盖自己的印鉴证明该票据真实有效、如果有问题就可以找原持有人。 采购商黄世仁去农户杨白劳家里采购萝卜。 黄世仁采购完成后,开具了一张票据给农户杨白劳,并说明让农户杨白劳自己去银行那换钱。 但农户杨白劳家离银行很远(银行在城镇中心,杨白劳在村里,两地距离很远),农户杨白劳不想去那么远换钱, 而且刚好他也打算买点种子为下一年做准备(种子商就在村里),所以农户杨白劳找到了种子商刘三姐。 农户杨白劳将种子买好,并将票据给了种子商。种子商刘三姐说,你这票据能兑换吗,万一兑换不成呢? 于是,农户杨白劳就说,那我在支票后面签字证明,如果你领不到钱,就到我这来找我,我会补给你钱。 通过以上例子,我们可以知道:背书就有在票据背面签字以表达对信用的加强和支持的意思。 明星代言也是一种背书——_ 担保拍照更清晰,柔光双摄能不能照亮你的美就不确定了 _ 1.1.1 交易流程讲解
可以看到整个生命周期中,客户端,背书节点,排序节点,提交节点都参与了签名或者验签工作。除此之外:
1.2、哈希散列的应用场景介绍完非对称的应用场景,现在来看看哈希散列的应用场景。 1.2.1 哈希散列有哪些特点?哈希(Hash)算法主要作用是将一段任意长度的数据,经过计算转换成一段定长的数据。
1.2.2 哈希散列用在哪里?如果说非对称是交易的基础,那么哈希散列可以说是账本的基础。区块就是通过哈希进行来链接的。每个块都会包含前一个块的哈希值。 HASH还在其他地方发挥重要作用,比如在进行签名前,需要对整个消息进行散列,满足签名入参的消息格式;一些产生unique ID的地方也用到了HASH,比如key的SKI值等。
1.3、对称算法的应用场景把对称算法放到最后来介绍,因为对称算法在整个Fabric中,确实没有核心应用点。
2、什么是国密算法?接下来是第二部分,第一部分介绍了为什么要从密码算法入手,了解了密码算法的重要性以及不同种类的密码算法的应用场景,接下来主要介绍国密算法的相关内容。 首先回答一个问题: 2.1、为什么要用做国密改造?
根据国家互联网应急中心发布的互联网安全威胁报告,仅17年12月,境内被篡改网站数量就达到了4,130个,国家信息安全漏洞共享平台(CNVD)收集整理的信息系统安全漏洞多达1,554个,互联网安全形势仍然很严峻。
越来越多的国际通用密码算法屡屡被传出被破解、被攻击的传闻,存在较高的安全风险。
所以在结构中引入国密算法标准,对超级账本项目在国内的商业推广有很重要的作用。 2.2、 简单介绍国密算法国密算法是国家通用密码算法的简称,是国家密码管理局制定的自主可控的国产算法,包括SM1、SM2、SM3 、SM4、SM7、SM9、祖冲之密码算法(ZUC)等。
在金融领域目前主要使用公开的SM2、SM3、SM4三种商用密码算法,恰好对应上一章的算法种类,分别为非对称加密算法、哈希算法和对称加密算法:
SM2,SM3,SM4现在是公开标准,可以在公开渠道获取到算法细则,网上也有不同语言版本的实现可以参考,原理也比较复杂,我们也无需重复造轮子,直接用别人的代码(我们使用苏州同济区块链研究院实现的代码)就可以了。等到有空的时候,再去研究到底是怎么回事。 接下来,我们讲讲,从哪里着手进行国密支持改造。 3、改造切入点是什么?答案是BCCSP 密码服务套件。 BCCSP的全称是区块链密码服务提供者,它能够用来提供Fabric中加解密、签名校验相关功能。从上图中可以看到BCCSP通过Membership Service(成员服务提供者,现在独立来成为Fabric-CA)给相关核心功能和客户端SDK提供加密算法相关的服务。相关的核心功能集中在核心中,包括共识模块,背书模块等,在第一部分已经介绍了具体的业务场景。 通过BCCSP,Fabric中的密码算法模块可以实现** 插件式**,多种实现方式和多种标准的适配。对国密算法的支持首先就要通过这个模块进行入手,后面讲国密算法支持会再次讲到这个部分。 现在我们来看看BCCSP的接口具体提供了哪些功能。下面是BCCSP的接口集合: // BCCSP is the blockchain cryptographic service provider that offers // the implementation of cryptographic standards and algorithms. type BCCSP interface { // KeyGen generates a key using opts. KeyGen(opts KeyGenOpts) (k Key,err error) // KeyDeriv derives a key from k using opts. // The opts argument should be appropriate for the primitive used. KeyDeriv(k Key,opts KeyDerivOpts) (dk Key,err error) // KeyImport imports a key from its raw representation using opts. // The opts argument should be appropriate for the primitive used. KeyImport(raw interface{},opts KeyImportOpts) (k Key,err error) // GetKey returns the key this CSP associates to // the Subject Key Identifier ski. GetKey(ski []byte) (k Key,err error) // Hash hashes messages msg using options opts. // If opts is nil,the default hash function will be used. Hash(msg []byte,opts HashOpts) (hash []byte,err error) // GetHash returns and instance of hash.Hash using options opts. // If opts is nil,the default hash function will be returned. GetHash(opts HashOpts) (h hash.Hash,err error) // Sign signs digest using key k. // The opts argument should be appropriate for the algorithm used. // // Note that when a signature of a hash of a larger message is needed,// the caller is responsible for hashing the larger message and passing // the hash (as digest). Sign(k Key,digest []byte,opts SignerOpts) (signature []byte,err error) // Verify verifies signature against key k and digest // The opts argument should be appropriate for the algorithm used. Verify(k Key,signature,opts SignerOpts) (valid bool,err error) // Encrypt encrypts plaintext using key k. // The opts argument should be appropriate for the algorithm used. Encrypt(k Key,plaintext []byte,opts EncrypterOpts) (ciphertext []byte,err error) // Decrypt decrypts ciphertext using key k. // The opts argument should be appropriate for the algorithm used. Decrypt(k Key,ciphertext []byte,opts DecrypterOpts) (plaintext []byte,err error) }
可以看出,接口功能大体分成4类,即:
Fabric的密码算法支持都是依赖上一页中的四类接口完成的,开发者可以设计不同的CSP来提供不同形式的密码算法支持。现在Fabric提供了两种CSP可供选择:
对于国密的支持,可以自己重新设计CSP,也可以根据上面两个现有模块进行定制支持。 4、如何实现国密支持?最后一部分,介绍布国密支持的具体实现思路。 4.1、国密支持关注点首先了解一下进行国密支持需要关注哪几个方面内容。分为4个层次:
第一点BCCSP前面已经介绍了,可以通过改造sw和pkcs11部分工作,提供软件和硬件层面的支持。sw提供一套密码算法集,可以考虑在中间加入国密算法接口支持。 第二点是国密算法具体的实现,上一章最后已经说过了,直接用别人的就可以了。 第三点是X509证书支持,Fabric中证书创建和解析相关是加入Golang中的X509证书模块完成的,但是现在x509模块只支持RSA和ECDSA两种算法模式,所以如果直接引入原版的X509证书解析的话,在证书国密支持方面会比较棘手,这个问题可以通过重写x509文件或者在Fabric重新定义x509证书生成解析方法来解决。
第四点是秘钥相关部分,其中包括通过证书封装的公匙部分,还有本地存储的私钥部分。特别注意到SW中算法是可以通过秘钥的类型来动态选择的,并且能够更灵活应用,带格式的秘密存储是有必要的。比如现在通过pkcs1来存储RSA密钥,通过pkcs8来存储ECDSA密钥,SM2和ECDSA结构类似,也可以参考使用PKCS8来进行格式存储。 4.2、国密支持解决思路前面介绍了国密支持所需要关注的问题。除了BCCSP层面外,算法实现和X509证书支持Fabric是是直接引用的golang下面的标准库来支持的。 而标准库并没有对国密算法进行支持,所以这里引出了两种思路。
下面讲下两种方法的实现思路。 4.2.1、定制化golang环境这种方法好处在于,能够在不影响整个Fabric架构的前提下,更好的完成国密支持,并且可以进行动态配置需要使用的算法,不失灵活性。 上图中所示为整个国密支持中,Fabric和golang lib层面所需要定制的部分。黄色代表需要修改部分,红色代表新增部分。 上层为Fabric需要处理的模块,主要集中在BCCSP部分。下层为golang层面需要处理的模块,主要集中在crypto中。 如果想在golang层面做支持的话,那么整个系统的构建环境就需要做一定的定制:
4.2.2、一切交给Fabric目前我采用的是这种方案。 先说不好的地方:
好处是:
完全在Fabric层实现改造,需要从以下三个方面着手:
综合考虑下两种实现方法,后期考虑做定制化golang方案 4.3、外围支持除此之外,作为整个系统来看,Fabric做国密支持,也少不了外围的支持,包括Fabric-CA和Fabric-SDK。 4.3.1 Fabric-CA国密改造Fabric-CA主要是为了实现对加入联盟链的成员的身份控制以及数据生成保管。
CA可以考虑使用现有的国密CA系统,也可以考虑通过Fabric-CA来做搭建,目前采用后一种方案。 改造CA主要改动如下几个包:
4.3.2 Fabric-SDK国密改造Fabric-SDK主要是一个区块链的大框架,每一个应用发布上去,可以调用我们提供的SDK的功能。而Client-SDK现在有很多种版本,所以有一些工作量在里面。好在每个版本的密码服务套件都是插件化的,可以从以下几个方面着手:
Fabric官方文档Docs ? Architecture Reference ? Transaction Flow
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |