时间:2024-09-03
李 嶒 ,徐济成,
(1.安徽中澳科技职业学院 信息工程与艺术设计系,合肥 230041;2.安徽农业大学 信息与计算机学院,合肥 230036)
传统的身份认证系统由中心服务器存储和管理身份信息,认证服务器软硬件故障和遭受网络攻击的事件屡见不鲜[1]。为了彻底解决身份认证系统的安全威胁,迫切需要找到一种去中心化、数据安全性高、能有效抵抗网络攻击、能满足认证系统运行需求的技术解决方案。以太坊是区块链技术的典型应用,它作为比特币应用的升级版,应用场景不再局限在数字货币,支持智能合约开发和应用程序接口,适合开发各种去中心化的应用平台。以太坊体系架构中区块数据的链式结构保证了所有交易的可追溯,对等网状网络拓扑结构能实现应用系统的去中心化,数据写入共识机制可以有效抵御网络攻击。本文提出了在以太坊技术架构上设计身份认证系统模型的思路,通过任务集合和关系向量来形式化的描述认证系统模型。开发本地应用程序,编制以太坊智能合约,搭建以太坊网络环境,最终实现身份认证模型部署和运行。此模型的成功实施可以彻底解决传统中心化认证系统的安全缺陷。
认证系统的主要作用是为应用系统提供用户身份认证服务,一个完整的认证系统分为认证授权子系统、身份管理子系统和应用管理子系统。认证授权子系统是认证系统的核心,它通过将保存在认证系统中的用户信息和应用系统进行关联,对合法用户进行授权;身份管理子系统允许用户注册账户,对用户信息进行维护、更新和删除;应用管理子系统对应用系统的权限列表和授权策略进行管理,同时可以记录、监控和审计认证系统的数据操作行为。认证系统主要功能如图1所示。
根据第三方应用系统在认证系统保存的认证策略,认证系统负责对用户的认证请求进行响应处理,向合法用户发放令牌。令牌即用户访问操作应用系统的通行证,它保存了用户信息、权限信息和数字签名。取得令牌的用户可以对第三方应用系统进行访问和操作,未取得令牌的用户将被拒绝访问。认证的实现方式如图2所示。
传统的身份认证系统采用中心化的技术架构,用户的身份信息和应用系统的授权信息集中保存在中心服务器中,用户信息的所有权属于身份认证系统中心服务器,用户仅能在认证系统的授权下使用身份信息。在中心化的环境下,用户合法性的认证和应用程序的访问授权过分依赖中心服务器,存在一定的安全隐患。
1)在中心化技术框架下,服务器出现故障会影响整个系统的正常运行,导致用户不能使用和操作身份信息,应用程序无法正确识别合法用户。
2)第三方应用程序为了扩大用户范围需要在多个认证系统中注册授权信息,一旦其中一个认证系统信息泄露,第三方应用的安全性将受到威胁,导致合法用户遭受损失。
3)认证系统中管理员具有高于普通用户的信息操作权限[2],可以不加约束的查询、更新和删除用户信息,普通用户身份信息的安全性得不到保证。
为了能使用户获得身份信息的所有权,彻底解决因中心化结构导致的安全隐患,需要寻找一个去中心化的解决方案,将身份信息分布地存储在客户机中,并以安全可信的方式传递和管理身份信息。
区块链技术是“比特币”应用的底层数据处理技术,它通过块状数据的链式关联方式将数据交易的过程信息完整地存储在分布式层次数据库中,原始数据和数据的操作过程均被记录在由节点共同维护的“账本”中,保证了数据的真实性和可追溯性。
1)点对点的底层网络结构
区块链网络拓扑是点对点的网状结构,网状结构的特点是节点间可以不借助中心节点直接进行通信,其中一个节点或线路的故障不影响整个网络的正常运行。
2)去中心化的数据存储和操作
在区块链技术框架下,数据以区块的结构由链串链在一起,形成了一个树形的共享层次数据库,共享数据库分布的存储在节点中,由全体节点共同维护。某个节点请求对数据库进行操作,需要其他节点根据共识算法共同验证,保证了数据的安全。
3)操作过程可追溯
在区块链技术框架下,所有的对共享数据库的操作被完整的记录下来,所有的交易不允许被删除。严格意义上讲,区块链网络中只有数据的写入,没有数据的更新和删除,当前数据的状态是通过交易信息写入来实现的。
4)公平可信的记账权获取机制
在区块链应用系统中,所有的节点用户地位平等,没有管理员用户和普通用户之分。节点用户的记账权由全网节点共同计算验证,这种验证过程称为共识,共识算法的公平性决定了区块链网络的安全性和可信度。
当节点需要对区块链数据进行操作时,需要生成一个交易,同时向全网广播交易请求,其他节点通过共识算法共同计算验证,只有交易信息通过了验证,节点获取当前交易的记账权,才能将交易信息写入共享账本,未通过共识的交易将被拒绝写入账本。为了保证数据的安全,数据在传递过程中一直是加密的,区块链采用的是非对称加密技术,加密过程使用公钥,解密过程使用私钥[3]。私钥的所有者为生成交易信息的节点,只有生成交易的节点才能解密交易内容,保证了其他节点在共识计算中无法获取交易的内容,防止作弊行为。区块链数据操作方式如图3所示。
以太坊是“比特币”的高级版本,其应用场景不再局限于数字货币,已经成为了一种去中心化的系统解决方案。以太坊平台的核心技术点是允许用户编写能操作共享账本的智能合约,智能合约可以直接向区块链网络发送交易写入请求,同时可以接收共享账本中返回的状态数据,它封装了对区块链账本操作的代码,本地程序可以通过调用智能合约的函数来使用这些代码。
以太坊平台包含了智能合约开发和编译工具,提供了面向对象的脚本语言,支持区块链网络共识机制的定制和修改,以太坊平台的Geth工具用于装载和部署编译后的智能合约[4],智能合约虚拟机提供了智能合约运行的环境,应用程序接口实现了区块链账本和本地脚本程序的数据交换。以太坊的技术架构如图4所示。
传统的身份认证平台应包含身份认证、身份管理和行为审计三个核心功能模块,其中身份认证模块是整个平台的核心,它负责收集用户提供的身份信息,提取系统中的数据信息,将信息进行比对后确定是否允许或拒绝登录;身份管理模块允许用户注册身份信息、更新身份信息和注销身份信息,在传统认证平台中需要管理员对用户的操作进行核实验证;行为审计模块记录身份认证平台用户的操作,监控包括管理员在内的所有用户的行为,以便及时发现非法操作,保证信息安全。
在中心化的技术框架上,中心服务器负责管理身份信息和处理用户请求,系统管理员具有高于普通用户的权限,身份认证的各种功能有非常成熟的实现方式。区块链技术建立在对等网络环境上,通过共识算法实现共享数据库的管理,其数据存储和操作方式不同于传统C/S中心化网络环境,节点计算机拥有平等的身份信息操作权限,没有中心服务器和管理员账户,因此需要对身份认证功能进行梳理分析,探讨其在区块链技术架构上实现的可行性。具体可行性分析结果如表1所示。
表1 身份认证功能的实现方式比较
区块链网络环境下认证系统的运行不依赖中心服务器和中心数据库,身份信息的管理权归区块链节点所有,数据存储在节点共同维护的分布式共享账本中。为了实现数据防篡改,保证信息的安全可信,区块链网络中每个节点都保存了一个账本副本[5],交易信息在节点间达成共识后,区块链网络节点同步更新账本。区块链环境下的身份认证操作流程如图5所示。
身份认证模型的核心是对身份信息的存储和管理,所有对账本的操作需要在本地处理后向区块链网络发布交易写入广播,节点通过共识算法共同验证交易的合法性,共识验证后的交易才允许写入账本。节点本地程序无法直接访问共享账本,而是通过调用通过智能合约对交易进行封装、加密、广播、解密和返回结果[6]。身份认证模型数据操作方式如图6所示。
1) 模型表示方法
基于以太坊的身份认证系统实现的功能由若干个操作任务组成,任务是身份认证模型的基本组成单位,任务分为本地任务和共识任务两种类型,其中本地任务是在节点计算机本地进行操作的任务,任务本身和共享账本不进行数据交换,不需要其他节点进行共识验证,数据写入前的合法性验证和数据读取后的本地处理均属于本地任务;共识任务是需要通过智能合约对共享账本进行读取和写入的操作,这种操作需要其他节点共同参与计算验证,达成共识后才能完成该操作。本地任务的集合构成了运行在操作系统上的本地应用,共识任务由智能合约函数集合来实现。
一个认证模型M={T,F},T=LT∪CT,LT∩CT=Φ,其中T是任务的集合,F是任务关系的集合,T有两个子集:①不对共享账本操作的本地任务集合LT,②需要操作共享账本的共识任务集合CT。任务和任务之间的先后关系称为弧,弧分为顺序弧和选择弧,顺序弧是指两个任务之间是顺序执行的先后关系,用向量f=(任务1,任务2)表示;选择弧用向量f=(任务1,布尔值,任务2)表示,用于分别表示判断条件为true和false的先后关系。认证模型的图形表示方法为:用矩形表示任务,用箭头表示弧。图7是一个任务间关系的图形表示方法,其形式化表示为M={{a,b,b},{(a,b),(b,false,a),(b,true,c)}}。
2) 认证模型任务分析
根据认证系统功能模块的划分,认证模型的主要操作有认证、注册、更新和注销,将这些操作细分为若干个任务,其中共识任务需要区块链网络节点共同验证,共识不成功的任务直接转入操作失败页面,表示用户身份存在问题,无法取得记账权。认证模型任务流程如图8所示,具体的任务描述如下:
①注册操作的任务描述
用户在注册页面录入身份信息,本地程序对录入的信息进行规范性判断,符合规范的信息调用智能合约函数请求查询共享账本,对注册信息进行重复性判断,注册信息重复的将被拒绝,不符合规范的信息也将要求重新注册;符合规范且没有重复的信息由智能合约向区块链网络发布交易请求,达成共识后写入共享账本。
②认证操作的任务描述
用户在登录页面输入认证信息,本地程序对认证信息的完整性进行判断,认证信息录入完整后由智能合约向区块链网络发布查询交易请求,返回的身份信息和用户提供的信息进行比对,合法用户登录成功,进入认证系统操作列表,可以选择操作或转向第三方应用;信息录入不完整和比对不通过将返回至登录页面。
③更新操作的任务描述
用户登录系统后,在身份信息更新页面录入新信息,本地程序对新信息进行校验,通过校验后的信息由智能合约向区块链网络发布修改身份交易请求,交易经过共识后写入共享账本,随后转向操作列表;未通过信息校验将返回至修改页面,未通过共识验证的转入交易失败页面。
④注销操作的任务描述
在区块链技术框架下,为了保证操作过程的可追溯性,不能直接删除数据,而是通过写入身份注销交易,用标记来表示某个身份信息的不可用。用户登录后选择注销个人账户信息,智能合约请求查询身份信息的关联数据,无应用关联的账户信息由智能合约向区块链网络发布注销身份交易,共识后的注销交易允许写入账本;有应用关联的身份信息将被要求退出应用,共识失败的交易也会被拒绝。
3) 认证建模
根据身份认证模型的任务描述,将任务和任务之间的关系进行分析梳理。为了形式化描述身份认证模型,需要对每一个任务进行编码,以便在以太坊平台中实现身份模型。在身份认证模型的实现过程中,本地任务通过本地函数封装代码实现,共识任务需要在本地函数中调用智能合约函数,因此需要在给编码时区分任务的类型。认证模型中任务和其后续任务的关系类型也要在编码时确定,以便进行形式化的描述。根据图8所描述的认证模型操作任务流程图,任务编码如表2所示。
表2 身份认证模型任务编码表
根据身份认证模型的形式化定义方法,结合表2的任务编码,任务集合T的描述如下:
T=LT∪CT,其中LT={t1,t2,t5,t6,t8,t9,t10,t12,t15},CT={t3,t4,t7,t11,t13,t14}。
顺序弧的形式化描述为两个先后顺序的任务组合而成的向量,选择弧形式化描述向量为先后顺序关系的两个任务中间加上一个布尔值。根据任务编码表中的关系类型和任务流程图,关系集合(弧集合)F的值如下:
F={(t1,t2),(t2,true,t3),(t2,false,t1),(t3,true,t4),(t3,false,t1),(t4,true,t5),(t4,false,t15),(t5,t6),(t6,true,t7),(t6,false,t5),(t7,true,t8),(t7,false,t15),(t8,t9),(t8,t12),(t9,t10),(t10,true,t11),(t10,false,t9),(t11,true,t8),(t11,false,t15),(t12,t13),(t13,true,t14),(t13,false,t15),(t14,true,t1),(t14,false,t15)}
1) 认证模型的实现方式
用户对共享账本操作时,需要通过本地变量对合约变量赋值,利用本地函数调用合约函数,返回值通过合约变量取回至本地。以太坊平台提供了过程调用协议,可以在本地script函数中调用智能合约状态变量和合约函数,实现交易的生成和发布,通过全网共同验证后获取操作共享账本的记账权[7],认证模型在以太坊平台中的实现方式如图9所示。
2) 智能合约
认证模型的共识任务需要调用智能合约中的相应函数来完成,由于对账本的操作都需要进行生成交易、加密交易、提交共识和返回结果,认证模型中的增、删、查、改任务本质上都是请求向账本写入交易,共识任务在智能合约中可以表示为一个交易函数,任务编码和操作内容通过函数参数来传递,在交易函数中需要对操作内容进行加工处理,生成交易并完成加密。在以太坊平台中,编写智能合约使用Solidity语言,Solidity语言是面向对象的以太坊智能合约编程语言,它提供了丰富的数据类型和结构控制语句,Solidity 源码文件经过编译后产生智能合约字节码文件[8],以太坊虚拟机是智能合约字节码文件的运行环境。身份认证的信息的核心任务伪代码如下:
contract user_account {
hash workID;//任务编码
address note;//产生交易节点的地址
mapping(address=>ID) account;//身份信息在账本中的地址
string msg;//合约函数执行返回信息
function set_workID(hash id) {//设定任务编码
workID = id;
}
function get_workID(hash id) returns (hash id) {//获取任务编码
return workID;
}
function account_create(account info){//注册(写入)身份信息任务函数
if(account.Registered==true){
console.log("fail ");
}else{
account_creater(info);//向账本中写入身份信息
}
function account_select(account info){//认证操作(查询)任务函数
if(account.full){
console.log("fail ");
}
else{
account_select(info);//查询身份信息并和本地数据比对
}
function account_delete(account info){//注销身份信息
....
}
function account_update(account info){//更新身份信息
....
}
.....
}
Solidity语言编写的智能合约需要编程成字节码,同时产生二进制的智能合约接口规范,智能合约字节码部署到以太坊平台中,用JavaScript编写的外部本地程序可以用web3.js和二进制接口来调用合约函数完成共享账本的操作[9],这种调用过程如图10所示。
3) 模型注册
认证模型中定义的任务和任务关系需要使用流程引擎来具体实现,流程引擎需要兼容本地程序编辑语言和运行环境。Bigbross Bossa流程引擎是按照嵌入式设计的,可以作为本地DApp的一个组件来直接调用,将模型中t1至t15任务定义为活动,通过设置活动的后续活动来表达活动之间的关系。定义活动和设置关系的伪代码如下:
function create_case(String msg){
/*建立一个流程引擎*/
Bossa caseFactory=
bossaFactory.defaultBossa();
/*声明一个模型*/
CaseType case=new CaseType();
/*声明任务t1至t15,并定义任务操作流程*/
Transition t1=case.register_Transition(function() t1);
Transition t2=case.register_Transition(function() t2);
Transition t3=case.register_Transition(function() t3);
Transition t4=case.register_Transition(function() t4);
......
Transition t15=case.register_Transition(function() t15);
/*定义t1至t15任务之间的关系,并表示出顺序弧和选择弧*/
t1.outPut(t2);//任务间的关系,该弧(t1,t2)为顺序弧
t2.outPut(t3,true);//选择弧(t2,true,t3),定义条件成立的后续任务
t2.outPut(t1,false);//选择弧(t2,false,t1),定义条件不成立的后续任务
t3.outPut(t4,true);
t3.outPut(t1,false);
....
t14.outPut(t15,false);
}
1) 网络环境搭建
以太坊技术平台运行在点对点网状网络环境中,建立一个点对点的网络环境是成功实施认证模型的关键。建立P2P网络连接需要进行网络通讯方式的初始化,将加入网络的节点地址保存在节点堆栈中[10],设置网络连接状态信息和错误审计,对通讯状态信息进行同步处理。在网络中要支持节点发布交易广播,网络要能接受新节点并同步处理新节点的网络互联请求。搭建网络环境的主要命令如下:
if exist config_File del config_File;//删除原有的网络配置文件
set init_Socket = (P2P_Protocol_File) ;//将P2P协议作为初始网络通讯方式
set init_Connection= (peer[]); //网络连接初始化
int32[] peer=sockets.push(IP[]);//将网络节点加入到节点堆栈中
set init_Message=Handler(p);//设置提示信息
goto Error_Tracer(msg);//网络错误状态审计
printf(p,broadcast_Msg(hash Trantion));//向P2P网络广播交易地址
do sync_Message_Handler(msg); //同步处理通讯状态信息
do Error_Message_Handler = (msg);//对网络通讯错误进行实时处理
connect newPeers = (newP) ; //处理新加入的节点
2) 合约部署
部署合约需要一个Ether账户,且该账户必须解锁。通过账户装载智能合约,编译后得到应用程序接口信息,通过本地程序调用web3 deploy进行挖矿确认,在本地程序中通过abi获取合约对象,完成合约的部署,最后根据任务需要来调用合约。智能合约部署过程如图11所示。
智能合约部署需要使用以太坊的Geth工具,按照智能合约的部署过程,需要新建一个账户,该账户在默认情况下包含用户名和密码两个字段,新账户需要通过挖矿激活,获得以太坊的账户的注册权,解锁在以太坊注册的账户,以便执行后续部署命令。利用web3 js来装载应用程序接口,通过接口生成一个智能合约变量,用于保存实例化后的智能合约对象,部署完成后就可以调用智能合约执行身份模型中定义的任务函数[11]。部署和调用智能合约的主要命令如下:
personal user=personal.newAccount(′user′,’password′)//新建一个账户信息
miner.start()&miner.stop()//开始挖矿,获得ether的注册权
personal.unlockAccount(user)//解锁ether账户
myAPI = web3.ether.contract(abi)//装载interface
Contract MyEtherContract= myAPI.new()//生成一个默认的智能合约对象
MyEtherContract = ether.contract(abi)//获取合约对象
myEtherContract= MyEtherContract.at(hash(address))//合约对象实例化
myEtherContract.multiply.call(function T1)//调用合约对象,执行模型任务
区块链技术和中心化的数据库管理系统在数据存储和操作方式有很多不同之处,传统数据库管理系统采用关系数据库存储数据,利用开放数据连接实现对数据库的操作,而以太坊应用数据存储在分布式共享层次数据库中,利用智能合约实现数据的写入,数据审核不依赖系统管理员,而通过共识机制由节点共同验证。鉴于以太坊框架的技术特点,身份认证模型需要对任务类型进行分类,本地任务的数据处理在本地完成,共识任务需要考虑共识计算过程。身份认证模型实施时采用任务流程引擎对任务及任务关系进行描述,任务的具体实现代码利用函数来封装运行,认证模型任务需要对共享账本操作时,通过在本地函数中调用以太坊智能合约来完成操作。本文论述的建模和实现方法不但适用于身份认证系统的设计和开发,对其他类型的去中心化应用也具有借鉴意义。文中使用的身份认证模型案例所包含的功能为认证系统最基本的功能,不同应用领域的身份认证模型还需要根据实际需求进行必要的功能扩展,操作任务的划分也需要进一步细化,本地程序的实现需要根据程序设计语言和程序运行环境做必要的修改,流程引擎选择时要注意与开发语言的匹配。
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!