如何实现超级账本Fabric链上数据的加密保护
如何实现超级账本Fabric链上数据的加密保护
这篇文章主要介绍如何实现超级账本Fabric链上数据的加密保护,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
1、Hyperledger Fabric链码加密/解密的应用背景
在企业环境中,有时我们需要处理一些敏感的数据,例如保存信用卡数据、银行信息、生物识别数据、健康信息等等,这些敏感数据是我们基于分布式账本的业务应用的一部分,最终用户通常希望即使在数据被渗透的情况下也能保证这些私密信息的安全性。
在一些传统的应用中,我们会将数据库中的数据加密,这样即使有人偷偷进入数据库,也无法理解数据的真实含义。同样,加密区块链数据库中的用户数据也是保护隐私的有效手段。现在让我们看看如何使用NodeJS链码来加密要写入区块链数据库的数据。
在我们开始后续的实现之前,需要先指出一点:由于引入了额外的加密和解密环节,这会导致生产环境中的应用处理速度变慢,要进行加密/解密处理的数据量越大,对应用性能的影响就越大。
2、Hyperledger Fabric链码加密/解密的处理流程
在我们开始加密处理之前,先解释一下要用到的链码的逻辑。示例链码就是一个简单的用户注册和登录实现。用户需要先提供用户名和密码进行注册,这些身份信息将以明文形式保存在数据库中,当用户登录时,将使用保存在数据库中的身份信息进行身份验证。因此我们将为这些身份信息添加 加密/解密层。
在这个示例中,我将尽力保持代码的简单,使用nodejs内置的crypto库。根据应用的不同,你也可以使用定制的加密实现。
加密方法实现如下:
functionencrypt(data,password){constcipher=crypto.createCipher('aes256',password);letencrypted=cipher.update(data,'utf8','hex');encrypted+=cipher.final('hex');returnencrypted;}
encrypt()
方法使用aes256算法加密指定的数据,它有两个参数:
data:要加密的数据
password:加密口令
解密方法实现如下:
functiondecrypt(cipherData,password){constdecipher=crypto.createDecipher('aes256',password);letdecrypted=decipher.update(cipherData,'hex','utf8');decrypted+=decipher.final('utf8');returndecrypted.toString();}
decrypt()
方法使用aes256算法和传入的加密口令,解密传入的加密数据。
3、Hyperledger Fabric链码加密/解密的实现代码
我们之前介绍了用户注册/登录链码的逻辑。当用户注册时提交其用户名和登录密码,因此我们需要在将用户的身份数据存入Hyperledger Fabric区块链之前先进行加密操作。
asyncsignUp(stub,args){if(args.length!=3){returnBuffer.from('Incorrectnumberofarguments.Expecting3');}else{console.info('**StoringCredentialsonBlockchain**');constcredentials={userName:args[0],password:args[1]};letdata=JSON.stringify(credentials);letcipher=encrypt(data,args[2]);awaitstub.putState(args[0],Buffer.from(JSON.stringify(cipher)));console.info('*SignupSuccessfull..YourUsernameis'+args[0]);returnBuffer.from('SignupSuccessfull..YourUsernameis'+args[0]);}}
同样,当登录时,链码需要验证用户名是否在Hyperledger Fabric的链上数据库中存在并检查密码是否正确。因此在检查身份信息之前,需要首先解密Hyperledger Fabric的链上数据:
asynclogin(stub,args){if(args.length!=3){returnBuffer.from('Incorrectnumberofarguments.Expecting3');}letuserName=args[0];letpassword=args[1];letcredentialsAsBytes=awaitstub.getState(args[0]);if(!credentialsAsBytes||credentialsAsBytes.toString().length<=0){returnBuffer.from('IncorrectUsername..!');}else{letdata=JSON.parse(credentialsAsBytes);letdecryptData=decrypt(data,args[2]);letcredentials=JSON.parse(decryptData);if(password!=credentials.password){returnBuffer.from('IncorrectPassword..!');}//Functionsgohereaftersigninconsole.log('LoginSuccessfull..✓');returnBuffer.from('LoginSuccessfull..');}}}
最后我们实现用户注册/登录链码的路由分发:
asyncInvoke(stub){letret=stub.getFunctionAndParameters();console.info(ret);letmethod=this[ret.fcn];if(!method){console.error('nofunctionofname:'+ret.fcn+'found');thrownewError('Receivedunknownfunction'+ret.fcn+'invocation');}try{letpayload=awaitmethod(stub,ret.params);returnshim.success(payload);}catch(err){console.log(err);returnshim.error(err);}}
以上是“如何实现超级账本Fabric链上数据的加密保护”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注恰卡编程网行业资讯频道!
推荐阅读
-
hyperledger fabric中Raft共识插件的示例分析
-
fabric Transient Data与Private Data使用的示例分析
-
Fabric Node SDK中CouchDB钱包怎么用
-
Fabric链码开发的原则有哪些
Fabric链码开发的原则有哪些这篇文章主要介绍了Fabric链码...
-
fabric示例e2e_cli中network_setup.sh流程是怎么样的
-
Fabric 2.0中链码操作过程是怎么样的
-
如何实现Fabric区块链基于Prometheus和StatsD的运维监控
-
如何下载Fabric-Sampl与二进制包
-
Fabric2.0中first-network生成配置的示例分析
-
fabric go sdk是什么