Hyperledger Fabric最佳實踐-使用Chaincode加密狀態資料庫

買賣虛擬貨幣
由於區塊鏈技術的快速的普及,IBM的Hyperledger Fabric專案飛速發展,不僅僅是因為它是區塊鏈框架之一,具有一些非常獨特的功能,例如許可的架構,即插即用元件,對機密事務的通道支援,模組化和可伸縮性。Hyperledger Fabric在這個區塊鏈時代成為了革命性的事物,它具有巨大的潛力來改變行業。Hyperledger Fabric在過去幾個月中取得了很大進步。無論您是Hyperledger Fabric的新手還是有一定經驗,並且想要快速掌握Hyperledger Fabric的生產和開發所採用的最佳實踐。我將在本系列中新增更多實踐和技巧。我現在要釋出我的首篇文章“使用Nodejs Chaincode加密和解密狀態資料庫。重   點在某些情況下,我們將處理敏感資料,例如將信用卡資料,銀行資訊,生物特徵資料,健康資訊等儲存為分散式賬本中業務應用程式的一部分。終端使用者總是希望保護這些機密資訊,即使資料庫遭到破壞。在很多應用程式中,我們需要對資料庫中的資料進行加密,這樣即使有人進入資料庫,他們也可能不知道資料是什麼。然而,在區塊鏈中,資料庫被駭客攻擊的可能性微乎其微。雖然駭客入侵區塊鏈資料庫的可能性較小,但在區塊鏈資料庫中儲存使用者資料時加密使用者資料是一種很好的做法。隨著近來Hyperledger Fabric的普及,讓我們看一下如何使用Nodejs Chaincode加密進入資料庫的資料。在任何生產級應用程式上嘗試此操作之前,您需要了解的一件事是,這會使操作變慢。此過程涉及兩個額外的步驟-加密和解密資料。這會稍微降低您的應用程式的速度,並且取決於您擁有的資料庫讀取和寫入的數量,這可能會對應用程式的效能產生重大影響。在決定加密資料庫中的所有內容之前,請記住這一點。業務流程在開始加密之前,首先讓我解釋一下我在這裡使用的鏈碼邏輯。實際上,我們的鏈碼在這裡所做的就是簡單的使用者註冊和登入。使用者將透過提供使用者名稱和密碼在我們的應用程式上註冊。這些憑據將以純文字格式儲存在資料庫中,並且每當使用者使用憑據登入時,所提供的憑據都將使用儲存在資料庫中的憑據進行驗證。因此我們將在這些憑據中新增加密和解密層。簡單 ??開始吧。
對於本例,我將保持這個簡單操作介紹並同時為Nodejs使用一個內建的加密庫。根據您正在處理的應用程式,您可以自定義加密實現並使其儘可能複雜。注意:我將在本文中演示的這些加密和解密方法在Nodejs Runtime v10.0.0下工作。(Nodejs鏈程式碼的當前執行時環境。— Hyperledger Fabric 1.4.3)但是在將來的版本中,鏈程式碼的Nodejs執行時,將會移至v12.13.0,因此會有更好的方法可以加密和解密資料。但是技術將是相同的。為此我還在此示例儲存庫中新增了v12.13.0相容的加密和解密方法。更新:出於安全和隱私考慮,我們不應該透過交易明確傳遞機密資訊(即密碼),因為它涉及將這些密碼儲存在特定的交易標頭中。如果網路中的其他使用者可以掃描這些區塊,則他們可以讀取您的機密資訊(即密碼)。取而代之的是,您可以對密碼進行雜湊處理,然後透過交易傳遞(這是另一個故事)。我在這裡描述的示例(註冊和登入)是為了解釋僅使用鏈碼進行加密/解密的概念。1、加密:此示例專案的整個加密實用程式如下所示:function encrypt(data){   
  const cipher = crypto.createCipher('aes256', password);    let encrypted = cipher.update(data, 'utf8', 'hex');  encrypted += cipher.final('hex');     return encrypted;}encrypt()方法將完全可以按照您的想法執行。使用內建的基本加密器僅需五行程式碼。crypto()函式將透過環境變數(.env)使用預定義的加密密碼獲取引數資料,它將基於給定的演算法aes256建立一個加密金鑰,並使用該加密金鑰對資料進行加密並返回加密的資料。這就是crypto()函式背後的全部思想。
#### 2、解密:以下是此示例專案的解密實用程式:function decrypt(cipherData)  {       const decipher = crypto.createDecipher('aes256', password);       let decrypted = decipher.update(cipherData, 'hex', 'utf8');   decrypted += decipher.final('utf8');   
   return decrypted.toString();}decrypt()方法將解密加密的資料。crypto()函式將再次採用一個引數cipherData。使用密碼,它將基於給定的演算法aes256建立解密金鑰,並使用解密金鑰解密cipherData並返回純資料。3、鏈碼的實現:注意:術語password表示兩個不同的引數。一個是業務應用程式的註冊/登入密碼,另一個是用於加密/解密資料的加密/解密密碼(透過.env提供給環境)。我們以前已經瞭解過了鏈碼邏輯。所以當使用者提交他的憑證(使用者名稱和密碼)時,我們應該在將它們放入資料庫之前對它們進行加密。所以我們的第一個任務是將它們傳遞給encrypt()方法。一旦資料加密,encrypt()方法將返回加密資料。現在我們需要把這個加密的資料放在資料庫中,金鑰是username。困惑的?檢視程式碼中的signUp()函式。
同樣,當使用者登入時,我們的鏈碼需要驗證使用者名稱是否存在於資料庫中,如果存在,它應該檢查提交的密碼是否正確。因此,為了檢查密碼是否正確,應該首先解密與特定金鑰(使用者名稱)相關聯的資料,因為它是加密的。所以我們需要將這個加密的資料傳遞給decrypt()方法。一旦解密,如果提供的登入密碼與與特定金鑰(使用者名稱)關聯的密碼匹配,它將驗證使用者登入。這是完整的程式碼。'use strict';const shim = require('fabric-shim');const util = require('util');const crypto = require('crypto');require('dotenv').config()
const password = process.env.SECRET;function encrypt(data){   const cipher = crypto.createCipher('aes256', password);   let encrypted = cipher.update(data, 'utf8', 'hex');   encrypted += cipher.final('hex');   return encrypted;
     }  function decrypt(cipherData)  {    const decipher = crypto.createDecipher('aes256', password);    let decrypted = decipher.update(cipherData, 'hex', 'utf8');    decrypted += decipher.final('utf8');    return decrypted.toString();
        }let Chaincode = class {   async Init(stub) {       console.info('=========== Instantiated Validation Chaincode===========');       return shim.success();            }
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);            }     }async signUp(stub, args) {
      if (args.length != 2) {     return Buffer.from('Incorrect number of arguments. Expecting 2');            }else{   console.info('**Storing Credentials on Blockchain**');   const credentials  = {userName:args[0],password:args[1]};   let data = JSON.stringify(credentials);
   let cipher = encrypt(data);   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]);    }}
async login(stub, args) {  if (args.length != 2) {     return Buffer.from('Incorrect number of arguments. Expecting 2');        }  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);  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..');      }  }}shim.start(new Chaincode());
 demo展示git clone https://github.com/Salmandabbakuti/hlf-encryption.gitcd hlf-encryption chmod 777 node-start.sh && chmod 777 go-start.sh./node-start.sh #nodejs chaincode encryption model (credentials storing and validation logic) head over to fauxton UI http://localhost:5984/_utils

./go-start.sh #golang chaincode encryption model (tuna supplychain logic)

不加密的資料庫中的純資料。

加密的資料庫。
如您所見,加密和解密魔力正在發揮作用。在下一篇文章中,我將透過三個簡單的步驟來說明如何將Hyperledger Explorer連線到您的網路。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;