天天看點

Fabric區塊鍊敏感資料加密方案

Hyperledger Fabric是最流行的區塊鍊開發架構之一,它有獨特的定位和一些鮮明的特點,例如許可制架構、可插拔元件、支援私密交易的通道、子產品化以及可擴充性,是以适合企業聯盟鍊應用的開發。在這篇文章中,我們将介紹如何使用鍊碼加密/解密儲存在Hyperledger Fabric區塊鍊上的敏感資料。

Hyperledger Fabric區塊鍊開發教程: Node.js | Java Golang

1、Hyperledger Fabric鍊碼加密/解密的應用背景

在企業環境中,有時我們需要處理一些敏感的資料,例如儲存信用卡資料、銀行資訊、生物識别資料、健康資訊等等,這些敏感資料是我們基于分布式賬本的業務應用的一部分,最終使用者通常希望即使在資料被滲透的情況下也能保證這些私密資訊的安全性。

在一些傳統的應用中,我們會将資料庫中的資料加密,這樣即使有人偷偷進入資料庫,也無法了解資料的真實含義。同樣,加密區塊鍊資料庫中的使用者資料也是保護隐私的有效手段。現在讓我們看看如何使用NodeJS鍊碼來加密要寫入區塊鍊資料庫的資料。

在我們開始後續的實作之前,需要先指出一點:由于引入了額外的加密和解密環節,這會導緻生産環境中的應用處理速度變慢,要進行加密/解密處理的資料量越大,對應用性能的影響就越大。

2、Hyperledger Fabric鍊碼加密/解密的處理流程

在我們開始加密處理之前,先解釋一下要用到的鍊碼的邏輯。示例鍊碼就是一個簡單的使用者注冊和登入實作。使用者需要先提供使用者名和密碼進行注冊,這些身份資訊将以明文形式儲存在資料庫中,當使用者登入時,将使用儲存在資料庫中的身份資訊進行身份驗證。是以我們将為這些身份資訊添加

加密/解密層。

在這個示例中,我将盡力保持代碼的簡單,使用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算法和傳入的加密密碼,解密傳入的加密資料。

3、Hyperledger Fabric鍊碼加密/解密的實作代碼

我們之前介紹了使用者注冊/登入鍊碼的邏輯。當使用者注冊時送出其使用者名和登入密碼,是以我們需要在将使用者的身份資料存入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);
            }
     }           

完整的Hyperledger Fabric代碼可以在

這裡

下載下傳。

原文連結:

Hyperledger Fabric最佳實踐 - 用鍊碼加密/解密鍊上資料 -彙智網