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最佳实践 - 用链码加密/解密链上数据 -汇智网

目录
相关文章
|
8月前
|
JavaScript Shell 测试技术
Fabric 自动化部署(套娃)的终极方案
Fabric 自动化部署(套娃)的终极方案
|
Java API 区块链
Hyperledger Fabric 2.x Java区块链应用
在上一篇文章中分享了智能合约的安装并使用cli客户端进行合约的调用;本文将使用Java代码基于fabric-gateway-java进行区块链网络的访问与交易,并集成SpringBoot框架。
553 0
Hyperledger Fabric 2.x Java区块链应用
|
网络安全 区块链 PHP
区块链之旅(五)超级账本简介及Git、Docker、Fabric的配置
超级账本是推动区块链行业应用的开源项目的总称,组织成员可以发起新的区块链项目,加入超级账本项目,但是还是要遵循Hyperledger的生命周期。
189 0
区块链之旅(五)超级账本简介及Git、Docker、Fabric的配置
|
JSON 安全 JavaScript
Fabric区块链通道更新Go开发包【fabric-config】
在这个教程中,我们将介绍如何使用fabric-config库进行通道配置的更新。我们将提供一个基于fabric-config的示例程序,该程序可以更改HyperledgerFabric的块切割参数。此外,教程还包括如何开始使用fabric-config库和函数的指南,以便你可以在项目中快速增加通道配置功能。
439 0
|
JavaScript Java Go
深入理解Fabric区块链Gossip机制
Gossip在Hyperledger Fabric中发挥着重要的作用。在这个教程中,我们将分阶段考察Fabric网络启动时gossip的运行机制,学习Fabric中的一些核心概念,例如主导节点/leader、锚节点/anchor等,理解 gossip是如何帮助Hyperledger Fabric成为一个可伸缩的联盟链平台。
1460 0
深入理解Fabric区块链Gossip机制
|
消息中间件 运维 供应链
|
运维 JavaScript Java
|
网络协议 JavaScript Java
|
SQL JavaScript 前端开发
|
区块链 消息中间件 Kafka
fabric区块链configtxgen配置文件解析
configtx.yaml是Hyperledger Fabric区块链网络运维工具configtxgen用于生成通道创世块或通道交易的配置文件,configtx.yaml的内容直接决定了所生成的创世区块的内容。
1422 0
相关产品
云迁移中心
推荐文章
更多