溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何實(shí)現(xiàn)超級(jí)賬本Fabric鏈上數(shù)據(jù)的加密保護(hù)

發(fā)布時(shí)間:2021-12-28 17:21:25 來源:億速云 閱讀:172 作者:小新 欄目:互聯(lián)網(wǎng)科技

這篇文章主要介紹如何實(shí)現(xiàn)超級(jí)賬本Fabric鏈上數(shù)據(jù)的加密保護(hù),文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

1、Hyperledger Fabric鏈碼加密/解密的應(yīng)用背景

在企業(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)用性能的影響就越大。

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

在我們開始加密處理之前,先解釋一下要用到的鏈碼的邏輯。示例鏈碼就是一個(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ù)。

3、Hyperledger Fabric鏈碼加密/解密的實(shí)現(xiàn)代碼

我們之前介紹了用戶注冊(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è)資訊頻道!

向AI問一下細(xì)節(jié)

免責(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)容。

AI