由于区块链技术的迅速普及,IBM的hyperledger fabric项目发展迅速,不仅因为它是区块链框架之一,而且还具有一些非常独特的功能,如许可体系结构、即插即用组件、对机密交易的通道支持、模块化和可扩展性。在区块链时代,Hyperledger结构已经成为一个革命性的东西。它有很大的潜力改变这个行业。在过去的几个月里,Hyperledger结构取得了很大的进步。无论您是新手还是在hyperledger fabric方面有经验的人,都希望快速掌握hyperledger fabric生产和开发中采用的**实践。我将在本系列中添加更多实践和技术。现在我要发表我的第一篇文章AMPL使用node链码来加密和解密状态数据库。
钥匙
在某些情况下,我们将处理敏感数据,如信用卡数据、银行信息、生物特征数据、健康信息等,作为分布式账本中业务应用程序的一部分。最终用户总是希望保护这些机密信息,即使数据库已损坏。在许多应用程序中,我们需要加密数据库中的数据,这样即使有人进入数据库,他们也可能不知道数据是什么。然而,在区块链中,数据库被黑客攻击的可能性非常小。虽然黑客不太可能入侵区块链数据库,但在区块链数据库中存储用户数据时加密用户数据是一个很好的做法。随着hyperledger结构最近的流行,让我们来看看如何使用node链码来加密进入数据库的数据。
在任何生产级应用程序上尝试此操作之前,您需要知道的一件事是,它会减慢操作速度。这个过程包括另外两个步骤-加密和解密数据。这会稍微减慢应用程序的速度,并且根据数据库的读写次数,可能会对应用程序的性能产生重大影响。在决定加密数据库中的所有内容之前,请记住这一点。
操作流程
在我开始加密之前,让我解释一下我在这里使用的链码逻辑。实际上,我们的链代码在这里做的是简单的用户注册和登录。用户将通过提供用户名和密码向我们的应用程序注册。这些凭据将以纯文本格式存储在数据库中,并且当用户使用凭据登录时,将使用存储在数据库中的凭据对提供的凭据进行身份验证。因此,我们将在这些凭证中添加加密和解密层。简单??我们开始吧。
对于这个例子,我将保留这个简单的介绍,并为node使用一个内置的加密库。根据正在使用的应用程序,可以自定义加密实现并使其尽可能复杂。
注意:本文将演示的加密和解密方法在node运行时10.0.0下工作。(node链代码的当前运行时环境。AMPL但是在未来的版本中,链代码的node将在运行时移动到12.13.0,因此将有更好的方法来加密和解密数据。但技术将是一样的。为此,我还向示例存储库添加了12.13.0兼容的加密和解密方法。
更新:出于安全和隐私原因,我们不应该通过事务显式传递机密信息(即密码),因为它涉及将这些密码存储在特定的事务头中。如果网络中的其他用户可以扫描这些块,他们可以读取您的机密信息(即密码)。相反,您可以散列密码并将其传递给事务(另一个故事)。我在这里描述的示例(注册和登录)是为了解释仅使用链码的加密/解密的概念。
一。加密:
此示例项目的整个加密实用程序如下所示:
functionencrypt(数据){constcipher=crypto.createCipher密码(’aes256’,密码);letencrypted=密码更新(数据,’utf8’,’hex’);加密+=密码.final(’hex’);returnencrypted;}
encrypt()方法将完全满足您的需要。使用内置的基本加密程序只需五行代码。函数的作用是:通过环境变量获取参数数据。En)使用预定义的加密密码。它将基于给定的算法aes256创建一个加密密钥,并使用该加密密钥加密数据并返回加密数据。这就是crypto()函数背后的全部思想。
二。解密:
以下是此示例项目的解密实用程序:
functiondecrypt(密文数据){ConstDecrypher=crypto.createDecrypher密码(’aes256’,密码);让解密=破译更新(cipherData,’hex’,’utf8’);解密+=破译终稿(’utf8’);返回decrypted.toString();}
decrypt()方法解密加密的数据。crypto()函数接受第二个参数cipherdata。使用密码,它将基于给定的算法aes256创建解密密钥,并使用解密密钥解密cipherdan并返回纯数据。
3链码的实现:
注意:术语password表示两个不同的参数。一个是业务应用程序的注册/登录密码,另一个是用于加密/解密数据(通过提供给环境)的加密/解密密码。环境)。
我们以前学过链码逻辑。因此,当用户提交他的凭据(用户名和密码)时,我们应该在将它们放入数据库之前对它们进行加密。所以我们的第一个任务是将它们传递给encrypt()方法。一旦数据被加密,encrypt()方法将返回加密的数据。现在我们需要把加密的数据放到数据库中。关键是用户名。困惑的?查看代码中的signup()函数。
同样,当用户登录时,我们的链码需要验证数据库中是否存在用户名,如果存在,则应该检查提交的密码是否正确。因此,为了检查密码是否正确,您应该首先解密与特定密钥(用户名)关联的数据,因为它是加密的。所以我们需要将这个加密的数据传递给decrypt()方法。一旦解密,如果提供的登录密码与与特定密钥(用户名)关联的密码匹配,它将验证用户的登录。这是完整的代码。
‘usestrict’;constshim=require(’fabric-shim’);constutil=require(’util’);constcrypto=require(’crypto’);require(’doten’)。config()constpassword=进程.en.SECRET;函数加密(数据){constcipher=crypto.createCipher密码(’aes256’,密码);letencrypted=密码更新(数据,’utf8’,’hex’);加密+=密码.final(’hex’);returnencrypted;}functiondecrypt(密文数据){ConstDecrypher=crypto.createDecrypher密码(’aes256’,密码);让解密=破译更新(cipherData,’hex’,’utf8’);解密+=破译终稿(’utf8’);返回decrypted.toString();}letChaincode=类{asyncInit(存根){控制台信息(’====InstantiatedValidationChaincode=====’);returnshim.成功(); }异步调用(存根){letret=stub.getFunctionAndParameters文件(); 控制台信息(ret);让m 火币4 od=这个[重置fcn];如果(!m 火币4外径){控制台错误(“nofunctionofname:”+重置fcn+’found’);thrownerror(’Receiedunknownfunction’+重置fcn+’inocation’);}尝试{letpayload=awaitm 火币4 od(存根,返回参数); returnshim.成功(有效载荷);}捕获(错误){控制台.log(错误);returnshim.error返回垫片错误(err);}}异步注册(存根,参数){if(参数长度!=2){返回缓冲区.from(’收入ectnumberofarguments.Expecting2’);}其他{控制台信息(’**StoringCredentialsonBlockchain**’);constcredentials={用户名:args[0],密码:args[1] };让数据=ON.stringify(凭据);letcipher=加密(数据);等待存根.putState(参数[0],缓冲区( ON.stringify(密码));控制台信息(’*SignupSuccessfull..YourUsernameis’+args[0]);返回缓冲区.from(’SignupSuccessfull..YourUsernameis’+args[0]);}异步登录(存根,参数){if(参数长度!=2){返回缓冲区.from(’收入ectnumberofarguments.Expecting2’);}letuserName=args[0];letpassword=args[1];letcredentialsAytes=等待存根.getState(参数[0]);如果(!证书为字节| |凭证aytes.toString(0).长度lt;;=0){返回缓冲区.from(“不正确的名字…”);}其他{letdata=ON.parse解析(credentialsAytes);letdecryptData=解密(数据);letcredentials=ON.parse解析(解密数据);如果(密码!= 凭据.密码{ 返回缓冲区.from(“密码不正确…”);}//函数gohereaftersigninconSOLe.log(’LoginSuccessfull..`’);返回缓冲区.from(’LoginSuccessfull..’);}}}垫片起动(newChaincode());
演示显示器
吉特lonehttps://github.com/Salmandabbakuti/hlf encryption.gitcdhlf-encryptionchmod777node-start.shAMPL;chmod777go start.sh./节点- 开始.sh#nodechaincodeencryptionmodel(凭证存储和验证逻辑)HeadOerofauxtonUIhttp://localhost:5984/实用程序/执行-开始.sh#golangchaincodeencryptionmodel(金*鱼)
未加密数据库中的纯数据。
加密数据库。
如你所见,加密和解密的魔力正在发挥作用。
在下一篇文章中,我将采取三个简单的步骤向您展示如何将hyperledger资源管理器连接到您的网络。
—————————————————
原著作者:萨尔曼·达巴库蒂
原始链接:https://medium.com/datadrieninestor/hyperledger-fabric-best-practices-in-production-1-encrypting-state-database-with-chaincode-8369b0bc345a
翻译:链三丰
文章标题:区块链研究实验室和超账本结构最佳实践-使用链码加密状态数据库
文章链接:https://www.btchangqing.cn/40140.html
更新时间:2020年06月17日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。