兄弟连区块链技术培训Fabric 1.0源代码分析(1)BCCSP(区块链加密服务提供者)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1/23兄弟连区块链技术培训Fabric1.0源代码分析(1)BCCSP(区块链加密服务提供者)#Fabric1.0源代码笔记之BCCSP(区块链加密服务提供者)##1、BCCSP概述BCCSP,全称BlockchainCryptographicServiceProvider,即区块链加密服务提供者,为Fabric提供加密标准和算法的实现,包括哈希、签名、校验、加解密等。BCCSP通过MSP(即MembershipServiceProvider成员关系服务提供者)给核心功能和客户端SDK提供加密算法相关服务。另外BCCSP支持可插拔,提供多种CSP,支持自定义CSP。目前支持sw和pkcs11两种实现。代码在bccsp目录,bccsp主要目录结构如下:*bccsp.go,主要是接口声明,定义了BCCSP和Key接口,以及众多Opts接口,如KeyGenOpts、KeyDerivOpts、KeyImportOpts、HashOpts、SignerOpts、EncrypterOpts和DecrypterOpts。*keystore.go,定义了KeyStore接口,即Key的管理和存储接口。如果Key不是暂时的,则存储在实现了该接口的对象中,否则不存储。**opts.go,bccsp所使用到的各种技术选项的实现。*[factory]目录,即bccsp工厂包,通过bccsp工厂返回bccsp实例,比如sw或pkcs11,如果自定义bccsp实现,也需加添加到factory中。*[sw]目录,为thesoftware-basedimplementationoftheBCCSP,即基于软件的BCCSP实现,通过调用go原生支持的密码算法实现,并提供keystore来保存密钥。*[pkcs11]目录,为bccsp的pkcs11实现,通过调用pkcs11接口实现相关加密操作,仅支持ecdsa、rsa以及aes算法,密码保存在pkcs11通过pin口令保护的数据库或者硬件设备中。*[utils]目录,为工具函数包。*[signer]目录,实现gocrypto标准库的Signer接口。补充:bccsp_test.go和mocks目录,可忽略。##2、接口定义###2.1、BCCSP接口定义BCCSP接口(区块链加密服务提供者)定义如下:2/23```gotypeBCCSPinterface{KeyGen(optsKeyGenOpts)(kKey,errerror)//生成KeyKeyDeriv(kKey,optsKeyDerivOpts)(dkKey,errerror)//派生KeyKeyImport(rawinterface{},optsKeyImportOpts)(kKey,errerror)//导入KeyGetKey(ski[]byte)(kKey,errerror)//获取KeyHash(msg[]byte,optsHashOpts)(hash[]byte,errerror)//哈希msgGetHash(optsHashOpts)(hhash.Hash,errerror)//获取哈希实例Sign(kKey,digest[]byte,optsSignerOpts)(signature[]byte,errerror)//签名Verify(kKey,signature,digest[]byte,optsSignerOpts)(validbool,errerror)//校验签名Encrypt(kKey,plaintext[]byte,optsEncrypterOpts)(ciphertext[]byte,errerror)//加密Decrypt(kKey,ciphertext[]byte,optsDecrypterOpts)(plaintext[]byte,errerror)//解密}//代码在bccsp/bccsp.go```Key接口(密钥)定义如下:```gotypeKeyinterface{Bytes()([]byte,error)//Key转换成字节形式SKI()[]byte//SKI,全称SubjectKeyIdentifier,主题密钥标识符Symmetric()bool//是否对称密钥,是为true,否则为falsePrivate()bool//是否为私钥,是为true,否则为falsePublicKey()(Key,error)//返回非对称密钥中的公钥,如果为对称密钥则返回错误}//代码在bccsp/bccsp.go```KeyStore接口(密钥存储)定义如下:```gotypeKeyStoreinterface{ReadOnly()bool//密钥库是否只读,只读时StoreKey将失败GetKey(ski[]byte)(kKey,errerror)//如果SKI通过,返回KeyStoreKey(kKey)(errerror)//将Key存储到密钥库中}3/23//代码在bccsp/keystore.go```###2.2、Opts接口定义KeyGenOpts接口(密钥生成选项)定义如下:```go//KeyGen(optsKeyGenOpts)(kKey,errerror)typeKeyGenOptsinterface{Algorithm()string//获取密钥生成算法的标识符Ephemeral()bool//要生成的密钥是否为暂时的,如果为长期密钥,需要通过SKI来完成存储和索引}//代码在bccsp/bccsp.go```KeyDerivOpts接口(密钥派生选项)定义如下:```go//KeyDeriv(kKey,optsKeyDerivOpts)(dkKey,errerror)typeKeyDerivOptsinterface{Algorithm()string//获取密钥派生算法标识符Ephemeral()bool//要派生的密钥是否为暂时的}//代码在bccsp/bccsp.go```KeyImportOpts接口(导入选项)定义如下:```go//KeyImport(rawinterface{},optsKeyImportOpts)(kKey,errerror)typeKeyImportOptsinterface{Algorithm()string//获取密钥导入算法标识符Ephemeral()bool//要生成的密钥是否为暂时的}//代码在bccsp/bccsp.go```HashOpts接口(哈希选项)定义如下:```go//Hash(msg[]byte,optsHashOpts)(hash[]byte,errerror)4/23typeHashOptsinterface{Algorithm()string//获取哈希算法标识符}//代码在bccsp/bccsp.go```SignerOpts接口(签名选项)定义如下:```go//Sign(kKey,digest[]byte,optsSignerOpts)(signature[]byte,errerror)//即go标准库crypto.SignerOpts接口typeSignerOptsinterface{crypto.SignerOpts}//代码在bccsp/bccsp.go```另外EncrypterOpts接口(加密选项)和DecrypterOpts接口(解密选项)均为空接口。```gotypeEncrypterOptsinterface{}typeDecrypterOptsinterface{}//代码在bccsp/bccsp.go```##3、SW实现方式###3.1、sw目录结构SW实现方式是默认实现方式,代码在bccsp/sw。主要目录结构如下:*impl.go,bccsp的SW实现。*internals.go,签名者、校验者、加密者、解密者等接口定义,包括:KeyGenerator、KeyDeriver、KeyImporter、Hasher、Signer、Verifier、Encryptor和Decryptor。*conf.go,bccsp的sw实现的配置定义。------*aes.go,AES类型的加密者(aescbcpkcs7Encryptor)和解密者(aescbcpkcs7Decryptor)接口实现。AES为一种对称加密算法。*ecdsa.go,ECDSA类型的签名者(ecdsaSigner)和校验者(ecdsaPrivateKeyVerifier和ecdsaPublicKeyKeyVerifier)接口实现。ECDSA即椭圆曲线算法。*rsa.go,RSA类型的签名者(rsaSigner)和校验者(rsaPrivateKeyVerifier和rsaPublicKeyKeyVerifier)接口实现。RSA为另一种非对称加密算法。5/23------*aeskey.go,AES类型的Key接口实现。*ecdsakey.go,ECDSA类型的Key接口实现,包括ecdsaPrivateKey和ecdsaPublicKey。*rsakey.go,RSA类型的Key接口实现,包括rsaPrivateKey和rsaPublicKey。------*dummyks.go,dummy类型的KeyStore接口实现,即dummyKeyStore,用于暂时性的Key,保存在内存中,系统关闭即消失。*fileks.go,file类型的KeyStore接口实现,即fileBasedKeyStore,用于长期的Key,保存在文件中。------*keygen.go,KeyGenerator接口实现,包括aesKeyGenerator、ecdsaKeyGenerator和rsaKeyGenerator。*keyderiv.go,KeyDeriver接口实现,包括aesPrivateKeyKeyDeriver、ecdsaPrivateKeyKeyDeriver和ecdsaPublicKeyKeyDeriver。*keyimport.go,KeyImporter接口实现,包括aes256ImportKeyOptsKeyImporter、ecdsaPKIXPublicKeyImportOptsKeyImporter、ecdsaPrivateKeyImportOptsKeyImporter、ecdsaGoPublicKeyImportOptsKeyImporter、rsaGoPublicKeyImportOptsKeyImporter、hmacImportKeyOptsKeyImporter和x509PublicKeyImportOptsKeyImporter。*hash.go,Hasher接口实现,即hasher。###3.2、SWbccsp配置即代码bccsp/sw/conf.go,config数据结构定义:elliptic.Curve为椭圆曲线接口,使用了crypto/elliptic包。有关椭圆曲线,参考。SHA,全称SecureHashAlgorithm,即安全哈希算法,参考。```gotypeconfigstruct{ellipticCurveelliptic.Curve//指定椭圆曲线,elliptic.P256()和elliptic.P384()分别为P-256曲线和P-384曲线hashFunctionfunc()hash.Hash//指定哈希函数,如SHA-2(SHA-256、SHA-384、SHA-512等)和SHA-3aesBitLengthint//指定AES密钥长度rsaBitLengthint//指定RSA密钥长度}//代码在bccsp/sw/conf.go```6/23func(conf*config)setSecurityLevel(secur

1 / 23
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功