李 嶒
安徽中澳科技职业学院信息工程与艺术设计系,安徽合肥,230041
随着互联网规模的不断扩大,物联网终端随处可见,云计算极大普及,各种新型网络平台层出不穷,网络应用已经彻底地融入到人们的日常生活中[1]。当用户需要使用平台服务时,需要提供相应的身份认证信息,每一个网络平台都有各自的身份认证方法,用户需要记忆多个用户名和口令,管理认证信息变得越来越烦琐,用户在不同网站注册账户也消耗了大量的网络资源。为了实现身份信息的共享和单点登录,出现了中心化的认证平台来集中管理账户信息,但也伴随着认证跨平台难度大、隐私保护困难、认证成本高等一系列网络安全问题。
区块链通过一种去中心化的共识机制让所有区块链网络的参与者共同维护一个账本系统,具有分布式存储、去中心化共识、信息不可篡改和不对称加密等特性。将区块链技术应用到身份认证系统,让用户拥有管理身份的权利并通过智能合约传递身份信息,可以有效解决传统中心化认证系统的安全缺陷[2]。
物联网的普及使终端用户多样化,每个应用平台拥有独立的身份认证系统,提供用户身份标识和用户证书,负责对用户的合法性进行验证,这种认证结构简单易行。同一个互联网用户在不同的应用平台上拥有多个虚拟身份,每个虚拟身份对应着一套应用账户信息,频繁地在多个身份间切换给用户带来不便[3]。
微软从1997年就开始尝试使用身份联盟的方式进行集中身份认证,加入联盟的应用平台接受同区域其他平台发出的身份标识和授权[4]。用户通过身份联盟平台的账户在不同的网站间进行单点登录,解决了用户多次注册和登录的不便。身份联盟平台采用中心化的系统构架,集中管理用户的身份信息,合作网站不必开发独立的授权和认证系统,身份认证处理过程由身份联盟平台负责执行,初步实现了身份信息的共享。身份联盟采用中心化的结构管理用户身份,如果中心服务器出现故障,将影响用户使用联盟中的应用平台,同时跨联盟访问技术也是身份联盟认证体系结构急需解决的问题。
开放授权是相对于封闭授权来讲的,封闭授权是指在本地计算机或局域网内的认证授权,互联网应用之间的授权即是开放授权。开放授权认证是通过一定的开放规则,由用户授权第三方应用访问该用户在某一个网络平台上保存的身份信息,而无需将账户信息提供给第三方应用[5]。通过授权,用户无须在第三方应用平台中注册信息,第三方应用也无法获取用户的隐私信息,授权平台在收到用户的授权请求后,向第三方应用发送认证结果。开放授权中,用户在一定程度上掌握了身份信息的使用权利。
上文描述的三种认证体系中,独立身份认证是最容易实现且扩展性较好,但对于用户的负担较大,无法实现单点登录;身份联盟内部共享认证信息,实现了用户单点登录,用户身份由中心服务器集中存储和管理;开放授权认证允许应用之间单项传递认证结果,用户掌握了授权结果的使用权利,但用户仍然没有身份信息的管理权。因此三种认证体系在用户体验和技术实现上仍不完美。
区块链技术是去中心化系统,不需要高成本的中心信息架构,个别节点的故障不会影响整个区块链系统的正常运行,几乎不存在系统瘫痪的风险。
区块链技术实现了链状区块结构、全网共享账本和非对称加密技术,具有去中心化、不可篡改、公开透明等特点,具有很强的抵御网络攻击能力。其发展经历三个阶段:区块链1.0,起源于比特币,是以实现虚拟货币支付和管理为主要应用的区块链;区块链2.0,以太坊的典型应用,构建了一个可编程的智能合约开发平台,其应用领域从数字货币拓展到了其他金融领域;区块链3.0,其应用完全超出了金融经济领域,成为了一种通用的解决方案[6]。区块链技术从1.0到3.0的主要技术特征和应用领域描述见表1。
表1 区块链技术主要技术特征和应用领域
在区块链3.0的架构中,超越了金融的应用范畴,而将区块链技术作为一种通用的解决方案,应用到各行各业,因此架构中需要具备企业级属性,如身份认证、许可授权、加密传输等。区块链体系架构如图1所示。
图1 区块链3.0体系架构图
区块链体系架构包含以下组成部分[7]:
(1)核心数据层:区块结构决定了区块链数据存储形式,区块结构由区块头、交易数据和区块数据三个部分组成,不同区块的区块头通过哈希指针串联起来,形成整个区块链底层数据的链表,Mekel树描述了区块链中节点的层次结构,合约容器为智能合约的开发提供了专用存储空间;
(2)网关控制层:区块链的网络结构是典型的点对点网络,区块链网络中节点参与数据的维护,当某个节点请求对区块数据进行操作时,其他节点参与身份认证和数据验证。通过认证的节点和验证后的数据才会被添加到账本中;
(3)共识机制层:区块链网络利用工作量证明(PoW)和权益证明(PoS)来阻止网络攻击,以保证数据的合法和安全,防止信息被篡改。在区块链3.0中,为了匹配各行业的使用需求,共识机制不是固定的,用户可以根据需要去选用配置;
(4)扩展接口层:区块链3.0提供了开发平台和应用程序编程接口(API),包含了智能合约开发语言、图形化开发工具、文件操作系统、数据存储查询和工作流引擎等技术。
非对称加密是区块链交易过程的一个重要组成部分。传统的对称加密算法中,加密和解密使用同一个密钥。而非对称加密算法,加密和解密使用不同的密钥,加密时使用的密钥是公开的,称为公钥;解密时使用的密钥是节点私有的,称为私钥。非对称加密保证了在节点间传递的信息始终是加密的,解密所有的私钥掌握在信息所有节点中,参与验证的其他节点无法对其解密[8]。公钥和私钥总是成对使用的,通过私钥可以计算出对应的公钥,而通过公钥不能计算出对应的私钥。区块链中的加密解密过程如图2所示。
图2 非对称加密过程图
去中心化是区块链技术的最重要特点,它采用了P2P的网络结构。参与区块链网络的节点既是服务器又是客户端,当节点产生交易时,其他节点需要对交易进行验证,达成共识后交易信息才会写入区块链账本。为了达成共识,产生交易的节点需要对自己所做的工作进行证明[9],常见的共识机制有工作量证明(PoW)、股权证明机制(PoS)、授权股权证明机制(DPoS)、拜占庭容错机制(BFT)和实用拜占庭容错机制(PBFT)等。不同的共识机制有自己的特点。在区块链3.0应用中,共识机制不再被封装在底层不可更改,用户可以根据实际需要来选择使用共识机制或共识机制的组合。智能合约是运行在区块链中的条件约定,当数据环境达到合约规定的条件后,合约会自动执行,无须人工触发[10]。在区块链3.0的技术架构中,完全支持智能合约的定制开发,编写好的智能合约可以方便地部署在区块链网络中。
区块(Block)和链表是区块链的核心数据结构,其中区块数据包含区块头和区块体两个部分,区块头的作用是和其他区块形成一个链表,区块体则保存认证系统所提供的身份数据。区块链的数据库体系是由一系列节点组成的二叉树,叶子节点的Hash值合在一起成为了父节点的Hash值,一直到根节点。区块数据存储在levelDB中,数据以键值对进行存储。在链式结构中有两个链表,一个是由所有的区块数据形成的主链,另一个则是所有区块头数据形成的区块头链表。一般情况下,将区块头链表看成区块链的一个部分。交易是区块体的重要数据结构,交易被节点加密签名形成一段指令,然后提交给区块链。
区块头的储存结构为:
type Header struct {
ParentHash common.Hash
UncleHash common.Hash
Coinbase common.Address
Root common.Hash
TxHash common.Hash
ReceiptHash common.Hash
....
}
区块体中包含了用于形成链表结构的区块头信息,存储结构如下:
type Block struct {
header *Header//区块头
uncles []*Header//前置区块头数组
transactions Transactions//交易名称
hash atomic.Value//自动产生hash值
size atomic.Value//区块数据大小
td *big.Int//封装到该区块的储存层次
ReceivedAt time.Time//区块数据被认可的时间
ReceivedFrom interface{}//共识接口
}
3.1.1 传统认证系统功能分析
传统的身份认证系统采用中心化的结构,用户的身份信息保存在底层数据库中,一个完整的认证系统需要包含身份认证、身份注册、身份更新和运行维护四大基本功能[11]。身份认证是将用户提交的信息和保存在系统中的身份信息进行比对,判断用户是否合法;身份注册允许用户根据需要新建一个身份信息,由管理员审核后写入数据库;身份更新功能允许用户对身份信息的非关键数据进行修改,管理员审核后对数据库进行更新;运行维护是认证系统对功能模块进行运行监控、事件采集和数据维护,提高系统的安全性和运行效率。认证系统功能示意如图3所示。
图3 认证系统功能示意图
3.1.2 基于区块链技术的认证系统可行性分析
根据传统身份认证系统的功能需求,结合区块链技术的工作原理和技术架构,分析设计认证系统功能需求在区块链3.0技术下的实现方式,具体的功能的实现方式见表2。
为了实现去中心化,身份认证系统需要遵循区块链的运行原理和操作规范,区块链3.0技术架构中的共识算法和智能合约在系统运行中起到重要作用,分布式账本的操作需要在达成共识的情况下进行。区块链3.0最重要的特征就是可编程智能合约和可设定共识机制,智能合约主要控制身份信息查询和系统维护,身份注册和更新需要全网节点共同参与验证,通过共识算法判断交易的合法性。在系统功能设计中,考虑到认证操作的频繁,账本的查询可以由智能合约直接驱动,无须其他节点达成共识,提高了身份信息的查询效率。基于区块链3.0的认证系统功能如图4所示。
表2 区块链技术的认证系统实现方式
认证系统建立在区块链网络之上,遵循区块链3.0技术规范和操作规则,建立在区块链技术架构上。最底层为区块链技术环境,主要是支持区块链工作的网络拓扑、密码学、节点设置、计算方法和数据结构;第二层为区块链核心层,是区块链3.0技术应用的基础,包括区块链核心支撑、共识机制、区块数据操作规范、网络操作规范,区块链3.0采用的是可设置共识,共识算法作为一个独立模块可选择、可组合;第三层是区块链3.0智能合约运行和网络操作调用的支持环境,认证系统的智能合约运行在虚拟机之上,认证系统的各种操作通过过程调用协议和区块链网络之间进行通信;第四层是智能合约层,该层是整个技术架构的关键,身份认证系统的逻辑操作通过智能合约和区块链进行交互,区块链3.0允许用户通过脚本语言编写智能合约;最上层就是最终实现的区块链3.0应用身份认证系统,它包含身份认证、身份注册、身份更新和运行维护四个模块。身份认证系统技术架构如图5所示。
图5 认证系统技术架构图
对认证系统包含的四个功能模块之间和自身业务处理逻辑进行设计,其中运行维护功能不需要和用户进行交互,其他功能均需要根据用户录入信息和用户的选择进行业务逻辑的流转。具体模块的业务逻辑流程如图6所示。
图6 认证系统业务逻辑示意图
3.3.1 运行维护模块
为了提高区块链网络的执行效率和数据处理能力,在智能合约中设定启动网络缓存清理、区块链账本优化和节点状态重置等维护函数触发的条件,当认证系统在节点计算机启动后自动执行智能合约,对优化条件进行检查,满足条件则执行维护操作,之后转入认证界面,不满足条件则直接转入认证界面。
3.3.2 身份认证模块
身份认证模块是认证系统的核心功能模块,主要工作原理是根据用户的认证请求,将保存在区块链账本中的身份信息和用户提供的信息进行比对,结果一致则返回成功认证信息,结果不一致则返回认证界面或转入注册界面。身份认证功能仅执行查询操作,不对区块链账本进行写入和更新,且查询仅限于区块信息拥有节点自身数据,不查询其他节点的区块信息,为了提高查询效率,降低节点计算机资源消耗,利用区块链3.0技术架构中的可设置共识机制,身份认证功能模块直接通过智能合约查询区块链账本,无须其他节点参与验证。
3.3.3 身份注册模块
参与区块链网络的节点计算机注册身份,产生一个新增区块数据交易,将身份信息写入区块链共享账本,身份信息的拥有者就是产生交易的节点。用户进入注册界面,输入身份信息,由页面内置script函数根据设定的规则判断信息的合法性,如果信息不合法,提示用户修改,信息合法,则产生一个交易,并调用智能合约写入函数,向全网发送交易广播,区块链网络的其他节点参与交易的验证,调用共识算法对交易进行计算,全网达成共识后将区块信息写入区块链共享账本。
3.3.4 身份更新模块
身份更新功能和身份注册功能类似,都需要对区块数据进行修改。身份更新需要在身份认证完成后由用户选择进入身份信息修改页面,由智能合约调用相应函数对账本中保存的身份信息进行查询,并将可修改的信息显示在修改页面的表单控件上,用户输入信息合法的情况下,产生一个区块数据修改交易,调用智能合约,全网节点根据共识算法共同验证并认可交易,最终对区块链共享账本进行更新。
区块链的网络结构是典型的P2P对等网络,构建身份认证平台的网络环境,需要定义P2P网络的通信方式,将待接入的节点压入已连接的节点堆栈,实现节点的初始化连接。建立连接后,对节点的错误状态进行跟踪,利用节点发出的广播报文,同步实现错误信息的处理。最后同步区块链信息,如果链路状态信息有更新,就向其他节点广播交易信息,目标节点接收到报文后产生交易验证数据。信息平台网络构建命令行如下:
var initP2PServer = () ; //定义P2P通信模式
var initConnection = (ws); //初始化连接
sockets.push(ws); //压入已连接的节点堆栈
initMessageHandler(ws);
initErrorTracer(ws);//错误状态跟踪
write(ws,responseLatestMsg());//广播
var initMessageHandler = (ws); //同步信息处理
var initErrorHandler = (ws); //错误信息处理
var handleNum = (message);
var connectToPeers = (newPeers) ; //连接新节点
智能合约是基于区块链技术的应用开发的核心,它存储在区块链网络上的一个特殊地址(合约容器)上,区块链3.0技术提供了智能合约开发、调试和运行的环境,智能合约是去中心化应用业务逻辑的载体,是身份认证系统和区块链底层交互的纽带。智能合约的开发和普通可执行程序开发有所区别,不需要考虑如何在操作系统和特定网络环境中独立运行,但要遵循区块链数据操作规范和虚拟机运行条件约束。一个完整的合约由一组状态变量和合约函数组成。
在编写智能合约时,首先定义存储用户身份信息的结构体数据类型,定义结构体的代码如下:
struct UserIfo{//定义身份信息结构体
string UserName;//用户名
int32 UserPassword;//用户密码
string UserRole;//用户角色
bool Registered;//注册状态
bool Enable;//可用状态
bool Logined;//登录状态
...
}
身份认证系统智能合约主要功能实现逻辑伪代码如下:
contract identification {
uint numRegistrants;//已注册数量
mapping(address=>user) users;//用户身份信息的地址映射
string tag;//执行结果
function set_numRegistrants(uint i) {//设定注册数
numRegistrants = i;
}
function get_numRegistrants() constant returns (uint v) {//查询注册数
return numRegistrants;
}
function register(UserIfo user){//身份注册操作函数
if(user.Registered){
tag=fail;
}
else{
Register( user);//调用注册事件(网络广播、共识计算、写入账本)
}
function login(user user){//身份认证操作函数
if(user.Logined){
tag=fail;
}
else{
Login( user);//调用认证事件(查询身份信息数据)
}
function update(UserIfo newUser){//身份更新操作函数
....
}
.....
}
区块链3.0应用开发完成后,需要使用Geth工具来启动和部署。智能合约虚拟机是智能合约的运行环境。智能合约需要编译产生可以运行在虚拟机上的二进制代码,获得合约区块链地址和合约接口的二进制表示。运行在虚拟机内部的代码被封装起来,不能和操作系统、网络环境和文件系统有任何的信息交换,其内部定义的变量和函数也是严格的设定调用条件。Geth在8545端口提供了过程调用协议接口RPC API,协议中数据传输采用JSON格式。
本文设计的认证系统分为区块链数据操作部分和交互界面部分,采用了去中心化的结构,没有中心服务器,交互界面客户端通过分发安装在每一个区块链网络节点计算机上,区块链操作部分是认证系统的核心,其运行原理完全遵循区块链操作机制。当一个交易产生时,通过过程调用协议启动智能合约,并向区块链网络发送广播,区块链网络中的节点接收到广播中的交易信息,从交易信息中提取智能合约的参数,通过本地虚拟机运行智能合约进行运算,根据共识算法互相验证数据,达成共识的数据作为区块数据写入账本。身份认证系统的运行原理如图7所示。
图7 身份认证系统运行原理图
传统身份认证系统采用中心化的结构,中心服务器作为身份信息的所有者,负责身份信息的存储和管理,用户仅有对身份信息的部分操作权限。目前,区块链技术的应用完全超出了金融领域,区块链3.0提供的可设置共识和可编程智能合约使区块链在其他领域应用成为可能。根据区块链技术的去中心化思想,对身份认证系统的系统架构进行重新设计,让区块链网络节点共同维护和管理身份信息,区块链底层的树型数据结构实现了操作信息的可追溯,保证了身份信息的安全可靠。P2P的网络结构让参与节点在网络中拥有对等的地位,区块链网络中信息交换和数据验证建立在平等公平的基础上。区块链提供的共识算法,让参与节点共同验证交易信息,可以有效地抵御网络攻击造成的信息恶意篡改。智能合约定义了对身份信息进行操作的函数,通过过程调用协议实现了交互界面和底层数据的实时交换。基于区块链3.0架构的身份认证系统解决了中心化认证服务的产生的各种问题,但在系统的易用性、可移植性和运行效率上还需要攻关突破,可以采用封装技术来将智能合约、合约虚拟机和客户端统一分发安装在节点计算机上,通过改进的共识算法来提高运行效率。