您好,登錄后才能下訂單哦!
這篇文章主要介紹如何實現超級賬本Fabric鏈上數據的加密保護,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
在企業環境中,有時我們需要處理一些敏感的數據,例如保存信用卡數據、銀行信息、生物識別數據、健康信息等等,這些敏感數據是我們基于分布式賬本的業務應用的一部分,最終用戶通常希望即使在數據被滲透的情況下也能保證這些私密信息的安全性。
在一些傳統的應用中,我們會將數據庫中的數據加密,這樣即使有人偷偷進入數據庫,也無法理解數據的真實含義。同樣,加密區塊鏈數據庫中的用戶數據也是保護隱私的有效手段。現在讓我們看看如何使用NodeJS鏈碼來加密要寫入區塊鏈數據庫的數據。
在我們開始后續的實現之前,需要先指出一點:由于引入了額外的加密和解密環節,這會導致生產環境中的應用處理速度變慢,要進行加密/解密處理的數據量越大,對應用性能的影響就越大。
在我們開始加密處理之前,先解釋一下要用到的鏈碼的邏輯。示例鏈碼就是一個簡單的用戶注冊和登錄實現。用戶需要先提供用戶名和密碼進行注冊,這些身份信息將以明文形式保存在數據庫中,當用戶登錄時,將使用保存在數據庫中的身份信息進行身份驗證。因此我們將為這些身份信息添加 加密/解密層。
在這個示例中,我將盡力保持代碼的簡單,使用nodejs內置的crypto庫。根據應用的不同,你也可以使用定制的加密實現。
加密方法實現如下:
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算法加密指定的數據,它有兩個參數:
data:要加密的數據
password:加密口令
解密方法實現如下:
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算法和傳入的加密口令,解密傳入的加密數據。
我們之前介紹了用戶注冊/登錄鏈碼的邏輯。當用戶注冊時提交其用戶名和登錄密碼,因此我們需要在將用戶的身份數據存入Hyperledger Fabric區塊鏈之前先進行加密操作。
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]); } }
同樣,當登錄時,鏈碼需要驗證用戶名是否在Hyperledger Fabric的鏈上數據庫中存在并檢查密碼是否正確。因此在檢查身份信息之前,需要首先解密Hyperledger Fabric的鏈上數據:
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..'); } } }
最后我們實現用戶注冊/登錄鏈碼的路由分發:
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); } }
以上是“如何實現超級賬本Fabric鏈上數據的加密保護”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。