wickedvalley 2019-03-12
区块链高级技术专家群内部讲座系列活动。
群内由区块链相关团队或组织的技术专家、学者和负责人等组成,目前仅限邀请加入。
分享内容会在 TechFirst 微信公众号进行首发,欢迎关注。
嘉宾介绍
刘地军,现就职于中国网安密码国家重点实验室,负责和参与多项国家重点项目的设计和研发。近期一直跟踪学习 Hyperledger 开源项目,对平台底层相关技术设计和定制具有丰富经验。
讲座内容
Page 1
大家好,很荣幸被邀请至这里,和大家分享本人近期对 Hyperledger fabric 下面国密算法支持的一些工作情况。
我叫刘地军,中国网安重点实验室的研发工程师。最近团队在跟区块链相关的内容,个人也在积极跟进 fabric 项目的进展,很希望能为整个社区的发展、相关项目落地做一些贡献。附上联系方式,希望后面能和大家就相关技术问题更多的交流。
Page 2
今天要分享的内容主要分为 4 个部分,首先是密码算法在 Fabric 中的应用场景,简单的国密算法介绍,Fabric 中 BCCSP 密码服务套件的介绍,最后着重介绍整个 Fabric 中的国密算法支持相关内容。
Page 3
第一部分内容,首先介绍密码算法在整个 Fabric 中的应用场景。密码算法在区块链系统中起着举足轻重的作用,说是 no crypto no blockchain 也不足为过。密码算法大体分为非对称,对称和哈希散列三个大的种类,不同种类的密码算法用在了区块链系统的不同的地方。
首先介绍非对称算法的使用场景。非对称算法在 Fabric 中主要提供签名验签功能。签名验证工作存在于整个交易过程中,涉及到中间的每个节点。我们来看看整个交易生命周期中,签名验签是怎么发生作用的。
可以看到整个生命周期中,客户端,背书节点,排序节点,提交节点都参与了签名或者验签工作。
除此之外,
- 验证证书链本身的时候,用到了非对称算法相关内容
- 在建立 TLS 加密通道时,用到了非对称算法相关内容,值得注意的是,这个部分和交易部分是相对独立的。
Page 4
介绍完非对称的应用场景,现在来看看哈希散列的应用场景。
如果说非对称是交易的基础,那么哈希散列可以说是账本的基础。
Page 5
把对称算法放到最后来介绍,因为对称算法在整个 Fabric 中,确实没有核心应用点。
有可能你的业务需要存储加密数据在账本上,可以看看这个
https://github.com/hyperledger/fabric/tree/master/examples/chaincode/go/enccc_example
这个示例在 propose 交易的时候,会在 transient map里面附上对称加密秘钥和IV,这样 chaincode 就可以对数据进行加解密处理。保证存储在账本的数据变成只有你和特定 peer 之间的“小秘密”
Page 6
接下来是第二部分,第一部分介绍了不同种类的密码算法的应用场景,这个部分主要介绍国密算法的相关内容。对应到上一章节的算法种类,国密算法可以提供 SM2,SM3 和 SM4 来提供支持。
国密算法是我国自己的密码行业标准,也是某些领域的准入门槛。所以在 Fabric 中引入国密算法标准对于超级账本项目在国内的商业推广有很重要的作用。
Page 7
第三部分介绍一下 Fabric 中的BCCSP模块。整个 BCCSP 模块为 Fabric 提供密码算法相关的服务。从图中可以看到 BCCSP 通过 Membership Service(成员服务提供者)给相关核心功能和客户端SDK提供加密算法相关的服务。相关核心功能集中在 core 中,包括共识模块,背书模块等,在第一部分已经介绍了具体的业务场景。
通过 BCCSP,Fabric 中的密码算法模块可以实现插件式,多种实现方式和多种标准的适配。对国密算法的支持首先就要通过这个模块进行入手,后面讲国密算法支持会再次讲到这个部分。
Page 8
现在我们来看看 BCCSP 的接口具体提供了哪些功能。图中是 BCCSP 的接口集合,大体分成 4 类,分为:
1. 秘钥生命周期管理
- KeyGen 秘钥产生
- KeyDeriv 秘钥派生
- KeyImport 秘钥导入
- GetKey 秘钥导出
2. 哈希散列管理
- Hash Hash 运算
- GetHash 获取 Hash 功能
3. 签名验证管理
- Sign 签名功能
- Verify 验签功能
4. 加解密功能
- Encrypt 加密功能
- Decrypt 解密功能
Page 9
Fabric 的密码算法支持都是依赖上一页中的四类接口完成的,开发者可以设计不同的 CSP 来提供不同形式的密码算法支持。现在 Fabric 提供了两种 CSP 可供选择,sw 模式和 pcks11 模式。
其中 sw 模式是一套软件算法集合,通过 golang 的 crypto 库,提供不同类型的算法软件实现。
pkcs11 是 RSA 提供的一套标准密码接口 API,BCCSP 的 pkcs11 模块可以为实现了对应 api 接口的设备提供支持。
对于国密的支持,可以自己重新设计 CSP,也可以根据上面两个现有模块进行定制支持。
Page 10
最后第四部分,介绍 Fabric 中国密支持的解决思路。
首先了解一下进行国密支持需要关注哪几个方面内容。分为 4 个层次:BCCSP,算法实现,X509 证书支持和秘钥相关 内容。
Page 11
前面介绍了国密支持所需要关注的问题。除了 BCCSP 层面外,算法实现和 X509 证书支持 Fabric 都是直接引用的 golang 下面的标准库来支持的。
而标准库并没有对国密算法进行支持,所以这里引出了两种思路。
Page 12
第二种支持方式个人认为较前者更优,能够在不影响整个 Fabric 架构的前提下,更好的完成国密支持,并且可以进行动态配置需要使用的算法,不失灵活性。
图中所示为整个国密支持中,Fabric 和 golang lib 层面所需要定制的部分。黄色代表需要 修改部分,红色代表 新增部分。
上层为 Fabric 需要处理的模块,主要集中在 BCCSP 部分。下层为 golang 层面需要处理的模块,主要集中在 crypto 中。
Page 13
如果想在 golang 层面做支持的话,那么整个系统的构建环境就需要做一定的定制。
对于 native 的构建环境来说,需要将 golang 替换成国密版本支持的。
对于 docker 相关的,需要更改 docker image 中 golang 层的支持。Fabric 中,对 golang 的支持,是放在fabric-baseimage 中的。baseimage 中,将特定版本的 go 环境打包到镜像中,提供底层的支持。
baseimage 相关内容可以从 (官方仓库)[https://github.com/hyperledger/fabric-baseimage] 了解。
Page 14
下面说一下 pkcs11 的国密支持,这块的解决思路和 sw 的相同,sw 的关注点 pkcs11 也同样需要关注。这里还需要注意的是 pkcs11 本身是不支持国密算法的。也就是对说如果要做支持需要对 PKCS11 的接口标准也做一定的更改,所以对于设备厂商来说,每家可能对接口标准的定制都不太一样,所以由于不标准,导致平台适配会出现问题。
国家密码管理局在 2011 年也制定了相关的接口标准,接口标准叫做 SKF。所以另一种考虑思路是,做国密支持可以通过 SKF 标准来做。
Page 15
那么国密支持还有一些问题,是需要注意的,系统中有些调用算法的部分,是 hard code 进去的,比如区块的hash部分,区块的hash部分现在是写死成sha256的,但是值得注意的是,channel config部分里面是有配置区块hash算法的。可以通过配置HashingAlgorithm参数来指定使用的hash算法,可惜当前版本并没有开放配置功能。
当然另一个问题是,是否系统中所有的算法都需要替换成国密标准,这个也是需要考虑的地方。
Page 16
除此之外,作为整个系统来看,Fabric 做国密支持,也少不了外围的支持,包括 CA 和 client-sdk
Page 17
本次 share 就到这里,谢谢大家。
答疑解惑
问:扩展 x.509 库,让 golang 官方支持SM标准是否可行?包括从规范和技术层面?
答:技术层面是没有问题的。但是规范上面可能需要一个阶段。需要上升到国际标准。当前我们的工作在 fabric 平台上,对于 bccsp 和 msp 方面的已经做了支持。并且在 cryptogen 上面加了 config 选项,可以选择使用 ecdsa 还是 SMx。平台会根据证书的种类,自动调整所使用的算法。sdk 方面正在尝试做 nodejs 方面的支持。还有一个尝试是对 channel config 的 HashingAlgorithm 做动态配置。
问:关于这块工作的进展,社区中开发者如何参与进来?
答:近期准备整理一份 Design spec 出来,欢迎大家多提建议和参与。
问:现在可以支持 SM2+SM3 的 x.509 证书了么,在 golang 层面做的??
答:是的,在 golang 层面做的。迁移到 golang 做,更方便些。