時間:2023-06-18|瀏覽:370
在本文中,我們將介紹如何使用鏈碼加密/解密保存在Hyperledger Fabric區(qū)塊鏈上的敏感數(shù)據(jù)。Hyperledger Fabric區(qū)塊鏈開發(fā)教程:Node.js|Java|Golang。
1、Hyperledger Fabric鏈碼加密/解密的應(yīng)用背景
在企業(yè)環(huán)境中,有時需要處理一些敏感的數(shù)據(jù)。例如,保存信用卡數(shù)據(jù)、銀行信息、生物識別數(shù)據(jù)、健康信息等等。這些敏感數(shù)據(jù)是基于分布式賬本的業(yè)務(wù)應(yīng)用的一部分。最終用戶通常希望即使在數(shù)據(jù)庫被滲透的情況下也能保證這些私密信息的安全性。
在一些傳統(tǒng)的應(yīng)用中,我們會將數(shù)據(jù)庫中的數(shù)據(jù)加密,這樣即使有人偷偷進(jìn)入數(shù)據(jù)庫,也無法理解數(shù)據(jù)的真實(shí)含義。同樣,加密區(qū)塊鏈數(shù)據(jù)庫中的用戶數(shù)據(jù)也是保護(hù)隱私的有效手段?,F(xiàn)在讓我們看看如何使用Node.js鏈碼來加密要寫入?yún)^(qū)塊鏈數(shù)據(jù)庫的數(shù)據(jù)。
在我們開始后續(xù)的實(shí)現(xiàn)之前,需要先指出一點(diǎn):由于引入了額外的加密和解密環(huán)節(jié),這會導(dǎo)致生產(chǎn)環(huán)境中的應(yīng)用處理速度變慢。要進(jìn)行加密/解密處理的數(shù)據(jù)量越大,對應(yīng)用性能的影響就越大。
2、Hyperledger Fabric鏈碼加密/解密的處理流程
在我們開始加密處理之前,先解釋一下要用到的鏈碼的邏輯。示例鏈碼就是一個簡單的用戶注冊和登錄實(shí)現(xiàn)。用戶需要先提供用戶名和密碼進(jìn)行注冊,這些身份信息將以明文形式保存在數(shù)據(jù)庫中。當(dāng)用戶登錄時,將使用保存在數(shù)據(jù)庫中的身份信息進(jìn)行身份驗(yàn)證。因此我們將為這些身份信息添加加密/解密層。
在這個示例中,我將盡力保持代碼的簡單,使用Node.js內(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ù),它有兩個參數(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ù)。
3、Hyperledger Fabric鏈碼加密/解密的實(shí)現(xiàn)代碼
我們之前介紹了用戶注冊/登錄鏈碼的邏輯。當(dāng)用戶注冊時提交其用戶名和登錄密碼,因此我們需要在將用戶的身份數(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,鏈碼需要驗(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..!"); } console.log("Login Successfull..?"); return Buffer.from("Login Successfull.."); } }
最后我們實(shí)現(xiàn)用戶注冊/登錄鏈碼的路由分發(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); } }
完整的Hyperledger Fabric代碼可以在這里下載。
原文鏈接:http://blog.hubwiz.com/2020/02/02/hyperledger-fabric-encrypt-state-database/
熱點(diǎn):區(qū)塊鏈 區(qū)塊鏈開發(fā) 框架