這篇文章主要介紹如何實(shí)現(xiàn)超級(jí)賬本Fabric鏈上數(shù)據(jù)的加密保護(hù),文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
青秀ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書(shū)合作)期待與您的合作!
在企業(yè)環(huán)境中,有時(shí)我們需要處理一些敏感的數(shù)據(jù),例如保存信用卡數(shù)據(jù)、銀行信息、生物識(shí)別數(shù)據(jù)、健康信息等等,這些敏感數(shù)據(jù)是我們基于分布式賬本的業(yè)務(wù)應(yīng)用的一部分,最終用戶(hù)通常希望即使在數(shù)據(jù)被滲透的情況下也能保證這些私密信息的安全性。
在一些傳統(tǒng)的應(yīng)用中,我們會(huì)將數(shù)據(jù)庫(kù)中的數(shù)據(jù)加密,這樣即使有人偷偷進(jìn)入數(shù)據(jù)庫(kù),也無(wú)法理解數(shù)據(jù)的真實(shí)含義。同樣,加密區(qū)塊鏈數(shù)據(jù)庫(kù)中的用戶(hù)數(shù)據(jù)也是保護(hù)隱私的有效手段?,F(xiàn)在讓我們看看如何使用NodeJS鏈碼來(lái)加密要寫(xiě)入?yún)^(qū)塊鏈數(shù)據(jù)庫(kù)的數(shù)據(jù)。
在我們開(kāi)始后續(xù)的實(shí)現(xiàn)之前,需要先指出一點(diǎn):由于引入了額外的加密和解密環(huán)節(jié),這會(huì)導(dǎo)致生產(chǎn)環(huán)境中的應(yīng)用處理速度變慢,要進(jìn)行加密/解密處理的數(shù)據(jù)量越大,對(duì)應(yīng)用性能的影響就越大。
在我們開(kāi)始加密處理之前,先解釋一下要用到的鏈碼的邏輯。示例鏈碼就是一個(gè)簡(jiǎn)單的用戶(hù)注冊(cè)和登錄實(shí)現(xiàn)。用戶(hù)需要先提供用戶(hù)名和密碼進(jìn)行注冊(cè),這些身份信息將以明文形式保存在數(shù)據(jù)庫(kù)中,當(dāng)用戶(hù)登錄時(shí),將使用保存在數(shù)據(jù)庫(kù)中的身份信息進(jìn)行身份驗(yàn)證。因此我們將為這些身份信息添加 加密/解密層。
在這個(gè)示例中,我將盡力保持代碼的簡(jiǎn)單,使用nodejs內(nèi)置的crypto庫(kù)。根據(jù)應(yīng)用的不同,你也可以使用定制的加密實(shí)現(xiàn)。
加密方法實(shí)現(xiàn)如下:
function encrypt(data,password){ const cipher = crypto.createCipher('aes256', password); let encrypted = cipher.update(data, 'utf8', 'hex'); encrypted += cipher.final('hex'); return encrypted; }
encrypt()
方法使用aes256算法加密指定的數(shù)據(jù),它有兩個(gè)參數(shù):
data:要加密的數(shù)據(jù)
password:加密口令
解密方法實(shí)現(xiàn)如下:
function decrypt(cipherData,password) { const decipher = crypto.createDecipher('aes256', password); let decrypted = decipher.update(cipherData, 'hex', 'utf8'); decrypted += decipher.final('utf8'); return decrypted.toString();}
decrypt()
方法使用aes256算法和傳入的加密口令,解密傳入的加密數(shù)據(jù)。
我們之前介紹了用戶(hù)注冊(cè)/登錄鏈碼的邏輯。當(dāng)用戶(hù)注冊(cè)時(shí)提交其用戶(hù)名和登錄密碼,因此我們需要在將用戶(hù)的身份數(shù)據(jù)存入Hyperledger Fabric區(qū)塊鏈之前先進(jìn)行加密操作。
async signUp(stub, args) { if (args.length != 3) { return Buffer.from('Incorrect number of arguments. Expecting 3'); }else{ console.info('**Storing Credentials on Blockchain**'); const credentials = {userName:args[0],password:args[1]}; let data = JSON.stringify(credentials); let cipher = encrypt(data,args[2]); await stub.putState(args[0], Buffer.from(JSON.stringify(cipher))); console.info('*Signup Successfull..Your Username is '+args[0]); return Buffer.from('Signup Successfull..Your Username is '+args[0]); } }
同樣,當(dāng)?shù)卿洉r(shí),鏈碼需要驗(yàn)證用戶(hù)名是否在Hyperledger Fabric的鏈上數(shù)據(jù)庫(kù)中存在并檢查密碼是否正確。因此在檢查身份信息之前,需要首先解密Hyperledger Fabric的鏈上數(shù)據(jù):
async login(stub, args) { if (args.length != 3) { return Buffer.from('Incorrect number of arguments. Expecting 3'); } let userName=args[0]; let password=args[1]; let credentialsAsBytes = await stub.getState(args[0]); if (!credentialsAsBytes || credentialsAsBytes.toString().length <= 0) { return Buffer.from('Incorrect Username..!'); } else{ let data= JSON.parse(credentialsAsBytes); let decryptData= decrypt(data,args[2]); let credentials= JSON.parse(decryptData); if (password!=credentials.password) { return Buffer.from('Incorrect Password..!'); } //Functions go here after signin console.log('Login Successfull..?'); return Buffer.from('Login Successfull..'); } } }
最后我們實(shí)現(xiàn)用戶(hù)注冊(cè)/登錄鏈碼的路由分發(fā):
async Invoke(stub) { let ret = stub.getFunctionAndParameters(); console.info(ret); let method = this[ret.fcn]; if (!method) { console.error('no function of name:' + ret.fcn + ' found'); throw new Error('Received unknown function ' + ret.fcn + ' invocation'); } try { let payload = await method(stub, ret.params); return shim.success(payload); } catch (err) { console.log(err); return shim.error(err); } }
以上是“如何實(shí)現(xiàn)超級(jí)賬本Fabric鏈上數(shù)據(jù)的加密保護(hù)”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!