专题:区块链兄弟认证专家刘地军参加超级账本Fabric国密算法的分享会实录!

本文是区块链技术专家刘地军在12月6日参加超级账本Fabric国密算法的分享会实录,内容已经过刘老师授权,版权归其所有!

作者介绍

刘地军,区块链兄弟社区认证专家,区块链平台研究专家,现在职责是在中国网安密码国家重点实验室,负责和参与多项国家重点项目的设计和研发。近期一直跟踪学习Hyperledger开源项目,对平台底层相关技术设计和定制具有丰富经验。

大家好,很荣幸被邀请至这里,和大家分享本人近期对Hyperledger结构下面国密算法支持的一些工作情况。

我叫刘地军,中国网安重点实验室的研发工程师。最近团队在跟区块链相关的内容,个人也在积极跟进织物项目的进展,很希望能为整个社区的发展,相关项目落地做一些贡献。附上联系方式,希望后面能和大家就相关技术问题更多的交流。

今天要分享的内容主要分为4个部分,首先是密码算法在Fabric中的应用场景,简单的国密算法介绍,Fabric中BCCSP密码服务套件的介绍,最后着重介绍整个Fabric中的国密算法支持相关内容。

第一部分内容,首先介绍密码算法在整个结构中的应用场景。密码算法在区块链系统中起着举足轻重的作用,说是没有密码没有blockchain也不足为过。密码算法大体分为非对称,对称和哈希散列三个大的种类,不同种类的密码算法用在了区块链系统的不同的地方。

首先介绍非对称算法的使用场景。非对称算法在Fabric中主要提供签名验签功能。签名验证工作存在于整个交易过程中,涉及到中间的每个节点。我们来看看整个交易生命周期中,签名验签是怎么发生作用的。

  • 端的客户在提交交易请求给背书节点时,需要在交易请求中附加自己对交易请求数据的签名
  • 节点背书首先需要验证客户端的发起的交易请求,验证请求的签名。并且会在执行完链码后,在响应里面数据附加上自己的背书签名
  • 端的客户收到背书查询查询结果后,需要也。对背书查询查询结果进行验签。并且组装后发送给排序节点。
  • 节点排序虽然并不会对交易内容进行验证,但是排序节点在出块的时候,在也会块上附上自己的签名信息。
  • 节点提交在更新账本前,会对交易背书内容进行验证,包括其中验证背书签名内容。

可以看到整个生命周期中,客户端,背书节点,排序节点,提交节点都参与了签名或者签签工作。除此之外,

  • 验证证书链本身的时候,用到了非对称算法相关内容
  • 在建立TLS加密通道时,用到了非对称算法相关内容,值得注意的是,这部分和交易部分是相对独立的。

介绍完非对称的应用场景,现在来看看哈希散列的应用场景。

如果说非对称是交易的基础,那么哈希散列可以说是账本的基础。

  • 区块就是通过哈希进行来链接的。每个块都会包含前一个块的哈希值。
  • hash还在其他地方发挥重要作用,比如在进行签名前,需要对整个消息进行散列,满足签名入参的消息格式。
  • 一些产生unique ID的地方也用到了hash,比如key的SKI值等。

把对称算法放到最后来介绍,因为对称算法在整个Fabric中,确实没有核心应用点。有可能看的这个

https://github.com/hyperledger/fabric/tree/master/examples/chaincode/go/enccc_example

这个例子在建议交易的时候,会在瞬态映射里面附上对称加密秘钥和IV,这样chaincode就可以对数据进行加解密处理。保证存储在账本的数据变成只有你和特定peer之间的“小秘密”

接下来是第二部分,第一部分介绍了不同种类的密码算法的应用场景,这个部分主要介绍国密算法的相关内容。对应到上一章节的算法种类,国密算法可以提供SM2,SM3SM4来提供支持。国密算法是我国自己的密码行业标准,也是一些领域的准入门槛。所以在结构中引入国密算法标准对超级账本项目在国内的商业推广有很重要的作用。

第三部分介绍一下Fabric中的BCCSP模块。整个BCCSP模块为Fabric提供密码算法相关的服务。从图中可以看到BCCSP通过Membership Service(成员服务提供者)给相关核心功能和客户端SDK提供加密算法相关的服务。相关的核心功能集中在核心中,包括共识模块,背书模块等,在第一部分已经介绍了具体的业务场景。

通过BCCSP,Fabric中的密码算法模块可以实现插件式,多种实现方式和多种标准的适配。对国密算法的支持首先就要通过这个模块进行入手,后面讲国密算法支持会再次讲到这个部分。

现在我们来看看BCCSP的接口具体提供了哪些功能。图中是BCCSP的接口集合,大体分成4类,分为:

  1. 秘钥生命周期管理
    • KeyGen秘钥产生
    • KeyDeriv秘钥派生
    • KeyImport秘钥导入
    • GetKey秘钥导出
  2. 哈希散列管理
    • 散列哈希运算
    • GetHash获取哈希功能
  3. 签名验证管理
    • 签名功能
    • 验证验签功能
  4. 加解密功能
    • 加密加密功能
    • Decrypt解密功能

Fabric的密码算法支持都是依赖上一页中的四类接口完成的,开发者可以设计不同的CSP来提供不同形式的密码算法支持。现在Fabric提供了两种CSP可供选择,sw模式和pcks11模式。

其中sw模式是一套软件算法集合,通过golang的加密库,提供不同类型的算法软件实现。

pkcs11是RSA提供的一套标准密码接口API,BCCSP的pkcs11模块可以为实现了对应api接口的设备提供支持。

对于国密的支持,可以自己重新设计CSP,也可以根据上面两个现有模块进行定制支持。


最后第四部分,介绍布料中国密支持的解决思路。

首先了解一下进行国密支持需要关注哪几个方面内容。分为4个层次BCCSP,算法实现,X509证书支持和秘钥相关内容。

  • 第一点BCCSP前面已经介绍了,可以通过改造sw和pkcs11部分工作,提供软件和硬件层面的支持。sw提供一套密码算法集,可以考虑在中间加入国密算法接口支持。
  • 第二点是国密算法具体的实现,SM2,SM3,SM4现在是公开标准,可以在公开渠道获取到算法细则,现在也有不同语言版本的实现可以参考。
  • 第三点是X509证书支持,Fabric中证书创建和解析相关是加入Golang中的X509证书模块完成的,但是现在x509模块只支持RSA和ECDSA两种算法模式,所以如果直接引入原版的X509证书解析的话,在证书国密支持方面会比较棘手,这个问题在后面会进一步讨论。另外X509里面会根据OID来指定所使用的签名算法,签名参数等信息,这部分可以参考“GMT 0015-2012”规范附件部分定义。
  • 第四点是秘钥相关部分,其中包括通过证书封装的公匙部分,还有本地存储的私钥部分。特别注意到sw中算法是可以通过秘钥的类型来动态选择的,并且能够更灵活应用,带格式的秘密存储是有必要的。比如现在通过pkcs1来存储RSA密钥,通过pkcs8来存储ECDSA密钥,SM2和ECDSA结构类似,也可以参考使用PKCS8来进行格式存储。

前面介绍了国密支持所需要关注的问题。除了BCCSP层面外,算法实现和X509证书支持Fabric是是直接引用的golang下面的标准库来支持的。

而标准库并没有对国密算法进行支持,所以这里引出了两种思路。

  • 一种是把算法实现和X509的证书支持都放在Fabric层面来做。这种方式的好处是不用动golang的标准库,所有工作都收敛到Fabric上。但是缺点是X509的证书部分需要在上层做定制,所有引入证书的地方,都需要做调整。代码也会有较多冗余部分。

  • 另一种是将算法实现和X509国密支持部分放在golang的标准lib上,这样面料层面的适配就会少很多。这种缺点的是golang部分需要做定制,特别是牵扯到用户环境还要同时考虑到本地和docker环境两种方式下,golang层面应该如何完成适配。后面会着重说这种方式的解决思路

第二种支持方式个人认为较前者更优,能够在不影响整个Fabric架构的前提下,更好的完成国密支持,并且可以进行动态配置需要使用的算法,不失灵活性。

图中所示为整个国密支持中,Fabric和golang lib层面所需要定制的部分。黄色代表需要修改部分,红色代表新增部分

上层为Fabric需要处理的模块,主要集中在BCCSP部分。下层为golang层面需要处理的模块,主要集中在crypto中。

如果想在golang层面做支持的话,那么整个系统的构建环境就需要做一定的定制。

对于本地的构建环境来说,需要将golang替换成国密版本支持的。

对于docker相关的,需要更改docker image中golang层的支持.Fabric中,对golang的支持,是放在fabric-baseimage中的.baseimage中,将特定版本的环境打包到镜像中,提供底层的支持。

baseimage相关内容可以从(官方仓库)[ https://github.com/hyperledger/fabric-baseimage ]了解

下面说一下pkcs11的国密支持,这块的解决思路和sw的相同,sw的关注点pkcs11也同样需要关注。这里还需要注意的是pkcs11本身是不支持国密算法的。也就是对说如果要做到支持需要对PKCS11的接口标准也做一定的更改,所以对设备厂商来说,每家可能对接口标准的定制都不太一样,所以由于不标准,导致平台适配会出现问题。

国家密码管理局在2011年也制定了相关的接口标准,接口标准叫做SKF。所以另一种考虑思路是,做国密支持可以通过SKF标准来做。

那么国密支持还有一些问题,是需要注意的,系统中有些调用算法的部分,是硬代码进去的,比如区块的哈希部分,区块的哈希部分现在是写死成sha256的,但是值得注意的是,通道配置部分里面是有配置区块哈希算法的。可以通过配置HashingAlgorithm参数来指定使用的哈希算法,可惜当前版本并没有开放配置功能。

当然另一个问题是,是否系统中所有的算法都需要替换成国密标准,这个也是需要考虑的地方。

除此之外,作为整个系统来看,Fabric做国密支持,也少不了外围的支持,包括CA和client-sdk

  • CA可以考虑使用现有的国密CA系统,也可以考虑通过Fabric-CA来做搭建,fabric-ca沿用fabric中的BCCSP套件,所以支持上难度也不大。

  • client-sdk现在有很多种版本,所以有一些工作量在里面。好在每个版本的密码服务套件都是插件化的,比如节点里面可以实现一套支持国密的CryptoSuite来提供支持,当然节点里面还是要对jsrsasign模块X509相关部分进行定制。

如果你喜欢所分享的内容,欢迎通过如下微信二维码对讲座专家进行支持和鼓励。

更多区块链技术分享,请通过

区块链技术交流qq群:634713958

区块链兄弟微信群请扫描二维码加入:

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享