基于区块链的电子证件系统的设计与实现

2018-10-25 01:21文淑华
现代计算机 2018年27期
关键词:哈希证件课程设计

文淑华

(电子科技大学信息与软件工程学院,成都 610054)

0 引言

电子科技大学信息与软件工程学院非常重视学生工程实践能力的培养,将综合课程设计列为学生的实践类核心课程,分为综合课程设计I、综合课程设计II、综合课程设计III这三门必修课程,分别对应1个学分、2个学分和2个学分。综合课程设计III针对高年级学生开设,要求学生在学习相关课程后参与一个具有一定难度的小型软件工程项目,要求学生利用软件工程的思想完成整个项目周期的所有阶段,并能对结果进行预测和模拟,在设计过程中能体现一定的创新意识。综合课程设计III的执行采用教师出题、学生做题的形式,指导教师需要考虑大三学生的能力和知识结构,拟出一个切合学生实际情况并能培养学生综合设计能力和创新能力的课题,因此本文将“基于区块链的电子证件系统”设计为综合课程设计III的课题,并对该系统使用的核心技术、设计和实现进行了详细的介绍,旨在培养学生使用软件工程思想,采用区块链技术、人脸识别技术、加密算法和Android应用编程技术综合设计和实现一个完整系统的能力,同时为学生的课题执行提供实验指导。

1 课题背景和研究意义

在现代社会中,人们对身份证、驾驶证、社保卡等诸多证件有着极强的依赖,但随着社会的发展,实体证件容易丢失、损坏、伪造、不便携带,丢失后补办手续复杂、周期长等缺点给人们生活造成了诸多不便。而如今的电子证件系统在安全性上往往不如人意。基于区块链的电子证件系统融合了当今非常火热的区块链技术[1-3]、采用了基于神经网络的人脸识别技术[4-5]、融合国密SM3算法[6]的区块链存储机制和基于国密SM2、SM4算法[7-10]的HTTPS通信机制,并使用负载均衡策略的C/S网络架构、基于Android平台的应用层设计与实现了该系统,全面培养学生根据软件系统的应用场景,选择合适的开发环境、工具与技术标准进行软件系统的设计和开发,培养学生解决复杂软件工程问题的能力和创新意识,符合综合课程设计III的毕业要求。

2 系统总体设计

用户首先进行人脸识别登录,客户端将接收到的信息整理发送到服务器,由服务器在区块链上查找人脸面部信息,确认登录有效。在登录之后,用户可以看到上传成功的证件、正在审核的证件及审核进度、认证失败的证件及失败原因等。用户可以选择上传信息选项,在填选完相应的证件信息后,终端会将该信息进行加密处理,并上传到专门的业务处理服务器,服务器接受这一部分数据后上报到公安机关(验证第三方)进行信息真伪的甄别。对于确认为真实有效的信息,服务器将用户上传的证件信息私有地址传送到区块链上。区块链服务器会将内容进行SM3加密后存储到区块链中。系统的功能架构如图1所示。

图1 基于区块链的电子证件系统功能架构图

基于区块链的电子证件系统的功能模块主要分为人脸识别管理、证件信息管理、证件信息查看、证件信息在线授权、用户信息管理等五大模块。

本系统采用客户端/服务器(C/S)结构,主体分为三个部分:客户端、服务器、认证机构。客户端中,用户可以进行证件信息上传、证件数据删除、证件授权等功能。服务器端实现数据管理,包括数据处理、调用、存储。认证机构则保证证件信息有效性,在系统内内置一个接口,用于提供到第三方进行信息认证。系统总体流程图如图2所示。

3 系统网络架构设计

本系统采用C/S架构。传统C/S架构技术成熟,且比较适合移动端应用。图3为系统的网络架构图。

本系统中数据备份涉及业务服务器数据备份和区块链服务器数据备份。业务服务器数据备份采用热备同构方式,只有主业务服务器接收写请求,然后由主服务器负责把数据同步到两个备份服务器,并保证每过一定时间进行更新,主服务器采用一对多的方式进行同步,相对于级联的方式,这种方式在某个备节点故障时,不会影响其他备节点的同步。

图2 系统总体流程图

图3 基于区块链的个人电子证件系统网络架构图

对于区块链备份,系统采用分布式冷备方式,将区块链按照一定规律碎片化后根据手机存储性能将这些碎片数据动态分配存储到不同手机终端上,在牺牲手机很小的存储空间的情况下完整地保存整条区块链。当区块链所在服务器发生故障导致数据丢失时服务器从各个终端节点进行数据回档,还原区块链。

4 核心技术设计

为了保障证件信息的安全性,本系统中用户身份认证、信息传输加密、证件信息存储三个模块分别采用了人脸识别技术、国产加密算法、区块链技术三大核心技术。其中,重点对区块链技术进行详细阐述。

4.1 基于国密SM 2、SM 4算法的系统交互设计

为了保障客户信息不会因为假冒客户端或服务器而被盗取,提高系统整体安全性,系统采用基于国密SM2、SM4算法的数字证书实现双向认证来实现两端认证交互。

4.2 基于神经网络的人脸识别机制设计

人脸特征具有很强的自身稳定性和个体差异性,是身份验证的理想依据。利用人脸生物特征进行身份对比是最自然和直接的身份验证方式。本系统中采用基于神经网络的人脸识别机制对用户身份进行验证,将人脸识别问题分为人脸检测、人脸校正、人脸特征提取和人脸鉴别四个部分。每个部分采用相应算法实现。

4.3 基于区块链的证件信息存储设计

对于认证后的证件信息的存储,系统创新性地提出了融合国密SM3算法的区块链存储机制,与传统的数据库存在数据丢失、数据泄露的问题相比,区块链技术以其去中心化、不可篡改性等特性很好地解决了这一系列问题,保证了证件信息的安全性。

(1)区块链

区块链本质上是一个对等网络(peer-to-peer)的分布式账本数据库,英文是Blockchain。比特币是区块链的第一个应用,是规模最大、应用范围最广的区块链。目前,关于区块链没有统一的定义,综合来看,区块链就是基于区块链技术形成的公共数据库(或称公共账本)。其中区块链技术是指多个参与方之间基于现代密码学、分布式一致性协议、点对点网络通信技术和智能合约编程语言组成的数据交换、处理和存储技术。与此同时,区块链技术本身仍在不断演变和发展。传统上,信用机制是集中的,集中的信任和信用机制必然导致集中组织成为价值链的核心,容易产生问题。另外,区块链技术首先在人类历史上实施了分散化的大规模信贷机制。区块链本身实际上是一系列链接的数据块。每个数据块使用散列算法记录一组树交易状态信息,这确保了每个块中的交易数据不会被篡改。

区块链的基础架构分为三层,如上图4所示。

图4 区块链的基础架构

网络层,区块链是基于IP通信协议和P2P网络的分布式系统,与传统的集中式系统不同,它不依赖集中式服务器节点来转发消息,而是每一个节点参与消息的转发,因此,安全性更高。

数据层,区块链是一个分布式数据库系统,只能追加,不能更改。如果它是一个开放的区块链,即一个公共链,那么这个账本可以被任何地方的任何人查询,完全透明。区块链网络中的各个节点通过使用共识算法来保持一致性的账本数据库。同时,使用加密签名和散列算法来确保数据库不能被篡改,不可伪造和可跟踪。作为比特币系统的设计者,中本聪巧妙地在系统设计中增加了一种经济激励的PoW(工作量证明)机制,即使拥有网络计算能力51%以上的人也不会对网络发起攻击,因为这样会损害他们自己的利益。因此,比特币系统自推出以来连续运行了七年多。

应用层,可以使用区块链,而不是传统的注册和清算系统。传统银行在维护账簿结算和清算支付交易方面的结构过于复杂,维护成本过高。就应用而言,区块链平台可为用户编写智能合约提供编程环境。智能合约可以把业务规则转化成在区块链平台自动执行的合约,不依赖可信任的第三方就可以被执行,也可以不被人为干预。从理论上讲,一旦部署完成,履行合同的条件一旦完成,将自动执行。区块链为执行结果提供了公开检查的便利,合同具有公平性和透明度。

(2)总体构思

考虑到本系统中区块链[11-14]实则是由不同的区块链接起来的,所以最重要的是设计好Block(区块),然后使用STL中的顺序性容器list来进行二次包装构成区块链。这里借鉴了如图5所示的结构。

图5 区块结构

(3)关键类和关键函数

本系统设计了三个关键类分别是Person类、Block类、TreeNode类。Person类是用来存储用户的具体信息的类,包含名字、电话号码、密保问题、出生信息、邮箱信息、居住地址、面部信息和一个独一无二的ID。在Person类中,为了拓展性的需要和格式的可控,更为了保证鲁棒性,上述成员变量都使用string来进行实现,面部信息的拓展则使用STL的vector来进行存储,同时使用一个const int_PersonQuestion Number来控制密保问题的数量,初步暂定为3个。

在本系统中设计Block类为区块类,用来存储区块相 关 信 息 ,有 Block(void)、InsertInfo(Person)、GetInfo(string)三个关键函数。Block(void)是Block类的构造函数,用来生成新区块的同时对这个区块进行相关的初始化的工作,包括制定区块的大小和设置该区块的初始哈希值等。GetInfo(string)返回值为vector,作用是从区块的索引表中查询某个人的所有相关信息,存储在一个vector中并返回。TreeNode类是哈希树类,用来管理对哈希树的相关操作,被包含在Block类中。InsertIn⁃fo(Person)函数返回值为void,用来将某个人的相关信息插入到区块的尾部,流程图如图6所示。

图6 信息插入区块流程图

(4)电子证件系统中哈希树设计与分析

①哈希树的基本原理

与传统的区块链技术使用SHA256算法对信息实现定长输出不同,本系统采用国密SM3算法对证件信息进行转换输出定长Hash值来构建这个HashTree,如图7所示。

HashTree采用类似于SegmentTree的方法来实现,考虑静态SegmentTree的建立,可以在nlog(n)的时间内建立整棵SegmentTree,但是静态算法只能对定长的数组建立,考虑到内存的限制和日后使用的动态性,不可能在每次Modify后重构整棵HashTree,所以此处考虑利用二进制分组的方法来重建整棵HashTree,即重构HashTree的时间复杂度为nlog2(n),每当大小超过2n之后就重构整棵HashTree。

图7 证件信息转换为哈希值

②个人电子证件系统哈希树的实现

系统使用函数Construct(int,int,TreeNode*)递归的构造区间范围在[l,r]的哈希树,并将根指针存储在带入的参数中。之后考虑HashTree建立起来后,对于某一个点的Modify操作:每次直接在HashTree上二分即可找到对应的LeafNode,并将LeafNode上的HashValue更新为一个新的值,同时在回溯的时候对于HashTree上的每一个可能被改变的结点,根据其左右儿子的HashValue来重新计算新的HashValue。系统用Delete(TreeNode*root)函数来递归的删除以root为根的哈希树,该函数返回值类型为void。GetHashValue(void)函数用来返回某个哈希树节点上的SM3密文,返回值类型为string。

(5)个人电子证件系统中国密SM3摘要算法的研究

在把证件信息转换为Hash值时,系统采用的是国密SM3算法。SM3密码杂凑算法采用Merkle-Dam⁃gard结构,消息分组512比特,输出杂凑值256比特。SM3算法的压缩函数与SHA256的压缩函数具有相似的结构,但SM3算法压缩函数的结构和消息扩展过程的设计更加复杂,例如压缩函数的每一轮都使用2个消息字,消息拓展过程的每一轮都使用5个消息字等。

5 核心技术实现

下面重点介绍基于区块链的证件信息存储技术实现部分。

5.1 基于区块链的证件信息存储实现

首先为了更好地管理用户信息,系统利用C++的面对对象的思想,创建了一个Peron类来实现,在类中定义了许多与用户信息相关的数据成员,而相关的数据成员的定义如下所示:

string Name;//名字

string PhoneNumber;//电话号码

string QuestionAnswer[__PersonQuestionNumber];//密保问题

string BornInformation;//出生信息

string Email;//邮箱信息

string LiveAdress;//居住地址

vectorPhotoInfo;//面部信息,用vector+string来存储,方便拓展

int ID;//每个人的id

除此之外系统定义了Set和Get方法来实现用户数据成员的赋值与获取。之后便是区块链技术的关键类Block类,这个类能够实现区块的构造和相关信息的处理。对于Block类,本文介绍几个关键的成员函数。Block()是类的构造函数,用来生成新区块的同时对这个区块进行初始化,具体代码如下:

Block(){

srand(time(0));

LimitSize=rand()%9+8;

mxsize=4;

RandomNumber=rand();//Create Random number tree=NULL;

tree->Construct(0,(1<

}

从这个构造函数中可以发现,在初始化LimitSize和RandomNumber这两个数据成员时用的是rand()函数,可见随机性强,安全性也有所提高。Block中定义了InsertInfo(Person Add)是关键成员函数,用于将被认证后的用户的证件信息插入区块之中,具体代码如下所示:

void Block::InsertInfo(Person Add){

if(List.size()+1>(1<

tree->Delete(tree);

tree=NULL;

++mxsize;

tree->Construct(0,(1<

int cur=0;

for(auto it:List)Modify(cur++,it.GetUnionInfo

());}

List.push_back(Add);

Map[Add.GetName()].emplace_back(Add);

Modify(List.size()-1,Add.GetUnionInfo());

}

系统的Block中用了STL中的顺序性容器list来进行二次包装构成区块链,这一点可以从代码中直接看出来,同时从代码中可以发现List.push_back(Add),从这语句中可以了解到系统的证书信息是插入到区块的尾部。

SearchInfo(Preson Ax)函数是用来查询用户信息是否已经存在,存在返回True,不存在返回False。具体代码如下所示:

bool Block::SearchInfo(Person Ax){

for(auto it:List)

if(it==Ax)

return true;

return false;

}

Block类中还有一个关键函数就是GetInfo(string Name)函数,该方法主要作用是从区块的索引表中查询某个人的所有相关信息,并存储在vector中返回,具体实现代码如下:

vectorBlock::GetInfo(string Name){

return Map[Name];

}

事实上在实现Block类之前系统还需要先用于实现存储证件信息的哈希树类TreeNode类。而TreeNo⁃de类的关键方法Construct(int l,int r,Block::TreeNode*ptr)用于递归的构造区间范围在[1,r]的哈希树,并将根指针存储在带入的参数中,具体实现代码如下所示:void Block::TreeNode::Construct(int l,int r,Block::TreeNode*ptr){

if(ptr==NULL){

ptr=new TreeNode(l,r);sm3_starts(&ptr->ctx);}

if(l

int mid=l+r>>1;ptr->lft=new TreeNode(l,mid);

ptr->rht=new TreeNode(mid+1,r);

Construct(l,mid,ptr->lft);Construct(mid+1,r,ptr->rht);}

}

5.2 SM 3算法实现

最后,在这一部分将会简单介绍SM3算法,SM3杂凑算法能够安全的对数据进行摘要处理,适用于商用密码应用中的数字签名和验证、消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。而系统中国密SM3算法是为了将证件信息转换为哈希树中的哈希值。国密SM3算法采用C语言实现,关键函数下表1所示。

6 结语

最后经实验仿真和实际测试,本系统能成功实现账号的注册、登录,上传、删除个人证件等主要功能,并且服务器能及时进行区块链数据恢复。人脸识别的登录机制让用户信息更加安全。能够部署到手机上的客户端使得系统的使用更为便捷。该综合设计课题能够充分培养学生使用区块链技术、加密技术等多方面的技术创新性的综合设计与实现系统的能力。

表1 国密SM3算法关键函数

猜你喜欢
哈希证件课程设计
“苏州园林:景致与情思”课程设计
基于特征选择的局部敏感哈希位选择算法
刚捡的
哈希值处理 功能全面更易用
文件哈希值处理一条龙
基于手机的微课程设计、开发与应用策略研究
A Study on the Application of Task—based Approach to English Vocabulary Teaching
中国人一生要办证件、证明超过400个
巧用哈希数值传递文件