您好,登錄后才能下訂單哦!
這篇文章主要介紹如何實(shí)現(xiàn)超級(jí)賬本Fabric鏈上數(shù)據(jù)的加密保護(hù),文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
在企業(yè)環(huán)境中,有時(shí)我們需要處理一些敏感的數(shù)據(jù),例如保存信用卡數(shù)據(jù)、銀行信息、生物識(shí)別數(shù)據(jù)、健康信息等等,這些敏感數(shù)據(jù)是我們基于分布式賬本的業(yè)務(wù)應(yīng)用的一部分,最終用戶通常希望即使在數(shù)據(jù)被滲透的情況下也能保證這些私密信息的安全性。
在一些傳統(tǒng)的應(yīng)用中,我們會(huì)將數(shù)據(jù)庫中的數(shù)據(jù)加密,這樣即使有人偷偷進(jìn)入數(shù)據(jù)庫,也無法理解數(shù)據(jù)的真實(shí)含義。同樣,加密區(qū)塊鏈數(shù)據(jù)庫中的用戶數(shù)據(jù)也是保護(hù)隱私的有效手段?,F(xiàn)在讓我們看看如何使用NodeJS鏈碼來加密要寫入?yún)^(qū)塊鏈數(shù)據(jù)庫的數(shù)據(jù)。
在我們開始后續(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)用性能的影響就越大。
在我們開始加密處理之前,先解釋一下要用到的鏈碼的邏輯。示例鏈碼就是一個(gè)簡(jiǎn)單的用戶注冊(cè)和登錄實(shí)現(xiàn)。用戶需要先提供用戶名和密碼進(jìn)行注冊(cè),這些身份信息將以明文形式保存在數(shù)據(jù)庫中,當(dāng)用戶登錄時(shí),將使用保存在數(shù)據(jù)庫中的身份信息進(jìn)行身份驗(yàn)證。因此我們將為這些身份信息添加 加密/解密層。
在這個(gè)示例中,我將盡力保持代碼的簡(jiǎn)單,使用nodejs內(nèi)置的crypto庫。根據(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ù)。
我們之前介紹了用戶注冊(cè)/登錄鏈碼的邏輯。當(dāng)用戶注冊(cè)時(shí)提交其用戶名和登錄密碼,因此我們需要在將用戶的身份數(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)證用戶名是否在Hyperledger Fabric的鏈上數(shù)據(jù)庫中存在并檢查密碼是否正確。因此在檢查身份信息之前,需要首先解密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)用戶注冊(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)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。