Hyperledger Fabric中的Identity

什么是Identity

区块链网络中存在如下的角色:peers, orderers, client application, administrators等等。每一个这样的角色都有一个身份标识(Identity),该身份标识是通过X.509 数字证书来表示的。这些身份标识决定了该角色的对区块链网络上资源的权限,比如是否有权限访问区块链上的某种信息。

数字身份有很多附加属性,供fabric来判断权限。数字身份给出了一个身份的组合结构,与之相关的属性称之为principal。Principals 就像用户ID或者是群组ID,但是更加复杂,因为principal中包含了该角色的一系列属性信息。当我们谈论principal的时候,就是在说觉得角色权限的各种属性信息。

为了保证身份(identity)是可以被验证的,Identity必须来自于一个受信任的颁发机构。在Fabric中,这是通过membership service provider (MSP) 来实现的。MSP是Fabric中的一个组件,它定义了管理有效identity的规则。Fabric中默认的MSP实现是使用X.509证书作为identity,采用传统的PKI(Public Key Infrastructure )结构模型。

说明Identity使用的简单场景

假设你正在逛超市买东西,在买单时发现收银台只支持银联和visa的银行卡。这时如果你想使用一张不属于银联和visa的卡来支付,无论你的卡中是否有足够的余额,这都是不被收银员接受的。

有一张有效的信用卡是不够的,还需要被超市所支持。PKI和MSP以相同的方式运作,PKI提供了一系列identity,而MSP来指明哪一个identity才是区块链网络的参与者。

PKI证书颁发和MSP提供了相似的功能,PKI就像一个银行卡发行机构,它分发很多不同类型的可以验证的Identity。MSP就像被超市所接受的银行卡,决定哪些Identity是可以信任的区块链网络成员。MSP讲可验证的Identity转化为区块链网络的成员。

什么是PKI

A public key infrastructure (PKI)是一组提供网络通讯安全的信息技术。https中的"s"字母就是由PKI来实现的,在传统的http上加入PKI技术来实现网络通信安全。

PKI由Certificate Authorities(CA) 组成,它向各方(例如,服务的用户、服务提供者)颁发数字证书,然后使用它们在与环境交换的消息中进行身份验证。一个Certificate Revocation List (CRL) 中包含了那些已经失效的证书的引用。证书可以被撤销,比如当一个与证书关联的私有加密材料泄露时,该证书应该被撤销。

尽管区块链不仅仅是一个通讯网络,但是它也是依赖于PKI来实现在网络参与者之间的安全通讯的。理解基本的PKI与MSP,对于理解区块链中消息的传输是十分重要的。

PKI有一下四个关键元素:

  • Digital Certificate 数字证书
  • Public and Private Keys 公钥、私钥
  • Certificate Authorities 证书颁发机构
  • Certificate Revocation List 证书撤销列表

关于PKI的介绍可以看看Wikipedia的PKI词条。

Digital Certificates 数字证书

数字证书是有个文档,其中包含了一系列证书中包含的属性。最常见的数字证书类型是符合X.509标准的证书,该标准允许在其结构中编码identity细节。

比如说,位于底特律的某个汽车制造厂家可能在其数字证书中会包含诸如地点、行业、UID等一系列信息。数字证书就像身份证一样,记录了所有者的关键信息。在X.509证书中,有许多属性信息,我们仅仅看一下如下图所示的几个。

上图这个数字证书描述了一个名为Mary Morris的组织,Mary是证书的所有者(主人),黑色加粗的一行文字描述了Mary的关键信息。该证书也描述了很多其他信息。更重要的是,Mary的公钥是随着证书分发的,而私钥却不是。

Mary的所有属性都可以用密码学加密记录,以防止被篡改。加密学允许Mary提供他的数字证书给其他人验证他的身份,只要其他人相信证书的颁发机构(CA)。只要CA保证这种加密信息的安全,任何读取该证书的人都可以确信Mary的信息没有被篡改过。可以将Mary的X.509证书看做是不会被篡改的数字身份。

Authentication, Public keys, and Private Keys

在安全通讯中,身份认证和消息完整性是两个很重要的概念。身份认证是说消息交换的双方知道是哪个发来的消息。而消息完整性是说,消息在传输过程中没有被破坏。比如说,你会去确认跟你交易的是否就是Mary而不是张三。Mary发给你一个信息,你想确认信息在传输中没有被张三更改。

传统的认证机制是基于数字签名的,允许用户对消息进行数字签名。数字签名也可以保证签名消息的完整性。

技术角度来看,数字签名需要各方都持有两个加密秘钥: 一个是公钥,可以广泛使用并朝哪个档身份验证锚;另一个是私钥,用于在消息上生成数字签名。数字签名的接受方可以通过检查其附属签名在于其发送方的公钥下是否有效来验证消息的来源和完整性。

私钥与公钥关系的唯一性使得加密的消息安全传输成为可能。唯一性的数学关系是这样的,私钥可以用来在消息上产生只符合特定公钥的签名,而且只在该消息上符合。

Certificate Authorities

一个节点加入区块链网络是通过节点从一个受信任的机构那里获取一个数字身份来达到的。在多数情况下,数字身份是以加密的数字证书(X.509)表示,该证书由Certificate Authorities(CA)所颁发。

CA是网络安全协议的一部分,你可能听过一些,比如:Symantec (originally Verisign), GeoTrust, DigiCert, GoDaddy, and Comodo等等。

CA向不同的角色分发证书,证书是被CA数字签名的,并与角色通过公钥绑定在一起的。因此,一个人如果信任CA(知道CA的public key),那么他就可以信任与该公钥绑定的角色。

证书可以被广泛的传播,因为证书中不包含角色或者是CA的私钥。

CA也有证书,它们可以广泛地提供证书。这允许给定CA颁发的标识的使用者通过检查证书是否只能由相应的私钥(CA)的持有者生成来验证它们。

在区块链网络中,每个角色如果想与网络中互动,都需要一个数字身份。您可能会说,可以使用一个或多个CA从数字的角度定义组织的成员。它是为组织的参与者提供可验证的数字身份的基础的CA。

Root CAs, Intermediate CAs and Chains of Trust

CA可以分为两种:Root CA和Intermediate CA。因为Root CAs (Symantec, Geotrust等)必须安全地向网络用户分发数以亿计的证书,所以将这个过程扩展到所谓的 Intermediate CA是有意义的。这些Intermediate CA由 Root CA或其他中介机构颁发证书,允许为链中的任何CA颁发的任何证书建立“信任链”。这种可以追踪回Root CA的能力,不仅让CA在提供安全的功能的同时进行扩展(这种方式允许组织受信任地使用Intermediate CA),而且CA链也避免了Root CA的泄露,ROOT CA泄露会危及整个链的信任。另一方面,如果一个中间CA被破坏了,暴露量就会小得多。

如上图所示,信任链是通过一个ROOT CA和一系列intermediate CA来建立的。每个CA都可以签署新的CA来构成信任链的一部分。

当涉及到跨多个组织颁发证书时,中间的CAs提供了大量的灵活性,这对于许可的区块链系统(如Fabric)非常有用。例如,您将看到不同的组织可能使用不同的根CAs,或者相同的根CA使用不同的中间CAs——它确实取决于网络的需要。

Fabric CA

CA太重要了,所以在Fabric中提供了一个内建的CA组件,以在区块链中创建CA。这个组件就是Fabric CA,这是一个私有的Root CA提供者,可以用来管理网络成员的数字身份(通过X.509证书)。因为Fabric CA是针对Fabric的根CA需求的定制CA,所以它本质上不能为浏览器中的通用/自动使用提供SSL证书。但是,由于某些CA必须用于管理标识(甚至在测试环境中),所以Fabric CA可以用于提供和管理证书。

Certificate Revocation Lists

Certificate Revocation Lists(CRL)很容易理解,他就是一系列已经被撤销的证书的引用。

如果一个第三方想去验证另一方的身份时,他首先会检查CA中的CRL是否有该证书,已确认该证书没有被撤销。

Hyperledger Fabric中的Identity的更多相关文章

  1. 在HyperLedger Fabric中启用CouchDB作为State Database

    回顾一下我之前的一篇博客,在Fabric 1.0中,我们存在3种类型的数据存储,一种是基于文件系统的区块链数据,这个跟比特币很像,比特币也是文件形式存储的.Fabric1.0中的区块链存储了Trans ...

  2. Hyperledger Fabric 中channel配置相关数据结构

    channel Configuration Transaction Hyperledger Fabric区块链网络中的配置存储在一个configuration-transaction的集合中,每个ch ...

  3. hyperledger fabric 中java chaincode 支持离线打包

    联盟链由于其本身的特性,目前应用在一些大型国有企业银行比较多.出于安全考虑,这些企业一般会隔离外网环境.所以在实际生产需求中可能存在需要在一个离线的环境中打包安装chaincode的情况. 本文基于这 ...

  4. 第6章 Hyperledger Fabric模型

    This section outlines the key design features woven into Hyperledger Fabric that fulfill its promise ...

  5. Hyperledger Fabric -- gossip 协议

    Hyperledger gossip   本文记述了Hyperledger Fabric 中 一种网络数据同步协议--gossip,它的主要作用是致力于账本数据的安全传输,保证不同节点之间状态的同步和 ...

  6. Hyperledger Fabric 1.2 --- Chaincode Operator 解读和测试(一)

    前言 本文主要目的是用于整理Hyperledger  Fabric中关于chaincode 管理和操作的内容,作者以release-1.2为范本进行讲解. 主要参考链接: https://hyperl ...

  7. Hyperledger Fabric 1.0 从零开始(四)——Fabric源码及镜像文件处理

    2:Fabric源码及镜像文件处理 2.1下载Fabric源码 下载Fabric源码是因为要用到源码中提到的列子和工具,工具编译需要用到go语言环境,因此需要把源码目录放到$GOPATH下.通过1.3 ...

  8. Hyperledger Fabric Model——超级账本组成模型

    超级账本组成模型 本文主要讲述Hyperledger Fabric的关键设计特性,并细述如何实现了一个全面的.可定制的企业级区块链解决方案: 资产定义--资产这里理解为任何具有货币价值的东西,它们都可 ...

  9. Hyperledger Fabric Membership Service Providers (MSP)——成员服务

    Membership Service Providers (MSP) 本文将介绍有关MSPs的设置和最佳实践的详细方案. Membership Service Providers (MSP)是一个旨在 ...

随机推荐

  1. MAC升级openssl

    Mac OSX EI Capitan 10.11.6升级自带Openssl - 简书 Mac10.11升级安装openssl _ 刘春桂的博客 openssl_openssl_ TLS_SSL and ...

  2. C++ C# VC VC.net以及VC++有什么区别和联系?

    C/C++是编程语言,C是C++的爸爸,也就是说C++从C发展而来,而C++完全兼容C的语法.国际上有一个专门管理C++的机构,它们负责C++的标准制定. VC++是微软公司的C++编译环境,使用它可 ...

  3. 前端用node+mysql实现简单服务端

    node express + mysql实现简单服务端前端新人想写服务端不想学PHP等后端语言怎么办,那就用js写后台吧!这也是我这个前端新人的学习成果分享,如有那些地方不对,请给我指出. 1.准备工 ...

  4. Altium Designer (DXP) 复制粘贴,放器件 出错报异常的原因

    安装好Altium Designer (DXP) 09板和2013后,运行后原理图复制粘贴元件或者放心的器件后出现下面异常, 原因是: 1.未启动 Print Spooler服务 2.没有安装任何打印 ...

  5. 移植触摸屏驱动到linux3.4.2

    1. 修改drivers/input/touchscreen/下的Makefile #obj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c2410_ts.o obj-$(C ...

  6. 155. Minimum Depth of Binary Tree【LintCode by java】

    Description Given a binary tree, find its minimum depth. The minimum depth is the number of nodes al ...

  7. Typescript函数

    编程都是需要函数的,因为有了函数就能复用很多东西了.不仅仅能够复用代码,还能保持代码的简洁性和提高编程的逻辑性. 在原生的JavaScript中,函数的定义有三种, function foo() {} ...

  8. 自己用原生JS写的轮播图,支持移动端触摸滑动,分页器圆点可以支持mouseover鼠标移入和click点击,高手看了勿喷哈

    自己用原生JavaScript写的轮播图,分页器圆点按钮可支持click点击,也可支持mouseover鼠标悬浮触发,同时支持移动端触摸滑动,有兴趣的友友可以试试哈,菜鸟一枚,高手看了勿喷,请多多指正 ...

  9. mybatsi中文乱码问题

    乱码问题:待总结,这里先贴出网友的博客: http://blog.csdn.net/zht666/article/details/8955952

  10. day 10 字典dict

    添加 xxx[新的key] = value 删除 del xx[key] 修改 xxx[已存在的key] = new_value 查询 xxx.get(key) 1. dict 字典 #### lis ...