基于区块链的智能门禁可信监控系统
2022-05-23胡志钢田翠华张一平高静敏洪定旋
胡志钢,田翠华,张一平,高静敏,洪定旋
(厦门理工学院 计算机与信息工程学院,福建 厦门 361024)
0 引 言
家居安防系统作为一种通过营造安全环境来提升居民生活质量的重要手段,越来越受到大家的重视。其中智能门禁的生物识别技术与远程控制技术极大方便了人们的出行与管理,但暴力破坏、恶意篡改以及单点故障造成的数据丢失等问题,给用户对家居安全的监控带来极大的不便。
区块链技术[1]的崛起,为解决智能家居数据隐私、安全和完整性等问题铺平了道路。史锦山等[2]通过智能合约[3]将访问控制策略存储到区块链上,以实现对物联网设备的安全访问。但无法避免通过暴力获取用户链下生物特征以及试图绕过门禁入侵室内等问题的发生。同时,研究人员提出多种通过区块链实现对物联网异构数据的安全共享方案。葛琳等[4]通过数据区块链和交易区块链的双链模式,满足数据采集与数据共享不同时效与安全需求。Nasonov等[5]提出了一种基于区块链的智能家居数据市场的框架,保证了获取数据的可靠性以及交易效率。此外研究人员通过将数据摘要写入区块链,利用智能合约实现对数据完整性的自动校验[6,7]。通过与区块链的结合能够有效确保数据共享以及交易过程中用户隐私的安全性和数据的完整性,但是对于通过链下实施的非法行为很难做出有效防范,同时智能合约一旦部署就不可修改的缺陷导致了应用出现漏洞将很难弥补。
针对上述问题,本文构建了一种基于以太坊区块链的门禁监控系统,主要工作是利用以太坊平台构建图灵完备的智能合约,实现数据的上链、用户的访问以及指令的下达,并且通过代理合约实现合约的升级,提升了系统的扩展性。而且,通过链下存储和链上备份,以及链下链上的多身份识别方式,确保了门禁身份识别的效率以及安全性。同时,入侵检测模块的设计,有效预防链下暴力获取用户身份特征的事件发生。
1 相关工作
区块链其本质是一种去中心化的数据结构,每个数据块使用SHA-256(哈希算法)加密方法与前一个区块相关联,并且利用共识算法与P2P网络极大地保证了信息的有效性、完整性和不可篡改的特性。因此,区块链通过数据一致性分发和冗余存储,极大保证了各节点数据的对称性,并让互不信任环境下的各节点在此基础上通过智能合约实现自主性,有效保障数据的完整和不可篡改。
区块链的强大优势使得区块链解决方案在不同类型的家居应用中取得了卓越的表现[5]。根据对现有的多篇关于区块链在智能家居中应用的总结,见表1。由表可知,现阶段区块链技术在智能家居中应用的侧重点,主要包括共识算法、第三方访问、家庭护理、自动化支付、共享经济、数据市场等服务及应用,而将区块链应用于家居安防的国内外研究才刚刚起步。因此本文主要针对家居安防中的智能门禁展开研究。
表1 现有的基于区块链的智能家居应用综述比较总结[12]
2 门禁监控系统整体设计
2.1 门禁系统硬件设计
随着当前先进的硬件支持,物联网设备已强大到足以支持相对复杂的智能系统。本文提出的门禁设备主要包含身份识别单元(IVU)、入侵检测单元(IDU)、区块链网关单元(BGU)。
IVU:身份识别单元主要由控制芯片、指纹识别、密码按键、电机驱动、声音提示、OLED显示器和无线通信模块组成。使用Atmega2560(8位AVR微控制器)的Arduino作为门禁的中央控制器,并通过串口通信连接WIFI模块ESP-01,采用TCP/IP协议与BGU实现通信。而且采用的光学指纹模块可以完成链下指纹存储和识别,配合区块链实现链上备份,很好地兼具了识别度高、速度快、安全性好的特点。同时密码识别模块作为备用开锁,利用虚伪密码(按照预设的密码长度,在正确密码前后输入任意数)和链上存储极大增加了非法获取密码的难度。然后配合声音与显示模块的互动,控制电机开启门禁。
IDU:该单元在身份识别单元的基础上增加了人体红外感应模块、超声波测距模块、运动感知模块,主要用于对门外及室内的环境感知。其中人体红外感应和超声波测距用于检测门禁外入侵,预防从门禁外入侵或破坏门禁以获取指纹的发生,而运动感知模块用于检测试图绕过门禁入侵室内的非法者。
BGU:本文采用Raspberry Pi作为BGU,可以视为区块链与传感器之间的中间组件,主要用于实现传感器等底层设备与以太坊区块链之间的交互。在本文的系统中,BGU拥有独立的以太坊账户,并且设备中嵌入了智能合约。具体地说,BGU是任何智能门禁系统的重要组成部分,主要负责链上链下身份数据的同步、访问记录的上链等任务,以及区块链网络各节点与传感器之间的数据收发器,同时也为每个数据源(传感器)之间提供相对稳定的网络连接。
门禁设备使用控制芯片为Atmega2560的单片机,用于通过程序控制门禁设备各模块的工作。通过通信端口,接收身份识别单元发送的身份信息,处理器根据实际情况进行链下处理或通过BGU进行链上识别判断身份是否认证,并且通过声音与显示器的提示信息进行交互,然后电机根据相应的控制信号做出反应。同时,用户通过客户端在区块链中存储的管理员密码,利用密码按键管理用户的指纹注册或注销。并且,BGU将接收到的入侵检测信息与访问信息进行广播上链。
2.2 系统体系框架
区块链技术因其具有与智能家居设备易于集成的灵活性和适应性,正在迅速塑造着智能家居信息生态系统。图1展示了基于区块链的智能门禁生态系统,它是一个由感知层、服务与支撑层、应用层组成的框架。
图1 系统架构及实现
感知层:通过物联网实体(例如各类传感器、BGU等硬件设施)进行数据采集与上链。其中门禁系统主动从指纹模块、密码模块、运动感知模块等外设采集信息,例如指纹、密码的输入信息、门禁周边环境信息等。此外,部分实时采集的数据初步分析是在门禁控制器中进行的。而作为整个设计好的区块链系统的一部分,BGU作为可信节点硬件级别的共识算法支持者,起着重要作用。同时,与各实体在去中心化的模式下相互协作,并将从门禁接收到的报警信息等进行上链存储,全程可追溯,实现信息不可篡改,通过点对点的分布式连接进行信息的传递。
服务与支撑层:该层主要包含区块链服务以及相关技术支撑,其中区块链服务包含分布式存储系统、共识算法、智能合约。其中分布式存储系统作为区块链的核心系统,将本文提出的系统内所有节点归为一个统一的分布式系统。并且采用基于PoA(proof-of-authority)的共识算法保证了各节点的运行和同步。同时,智能合约作为运行在区块链上并遵循预定规则自动执行的代码,方便了去中心化交易的执行,避免了在没有可信第三方下出现不必要的纠纷。同时,密码学、P2P等技术为区块链的稳定提供了支撑,如SHA-256加密算法保证了包含交易的区块通过散列值连接成链不可篡改。
应用层:本系统基于Truffle框架,采用HTML、CSS等前端技术,通过Web3.js与合约进行交互,实现了用户可以通过应用层提供的服务与智能家居实体进行通信与协作,从而实现信息的进一步处理并提供智能化服务。例如,用户可以通过客户端获取真实可信的门禁访问记录或发布门禁临时密码等可视化操作。
2.3 系统工作流程
如图1所示,系统的工作流程为:
(1)用户注册是通过客户端调用合约将身份信息与以太坊账户绑定的过程。用户利用本地生成的随机对称密钥sk_u对身份证明信息InfoID进行加密得到[InfoID]sk_u, 并使用公钥pk_u加密sk_u得到 [sk_u]pk_u。 同时,合约设置用户注册状态为queue并将审核节点加入审核名单中,方便审核节点直接调用密钥,其中审核节点由服务提供商担任。
(2)用户提交注册信息后,合约调用函数向审核节点发出验证请求,并触发请求事件(监听此事件的审核节点可以及时做出响应)。审核节点验证用户身份并调用合约将用户状态修改为pass。
(3)完成验证的用户,可以调用合约对房屋进行登记,将必要的信息上链存储。同时,合约为该房屋初始化一个成员名单,然后将登记者变为户主角色并加入其中。此时户主可以调用合约添加成员信息,并设置系统的访问控制策略,详见3.2.1节。
(4)门禁身份的录入:户主通过客户端设置开锁密码和管理员密码,合约将密码的hash值pwd_hash以及admin_hash进行上链。同时,通过门禁的密码按键输入管理员密码,录入指纹进行链下存储以及通过BGU进行链上备份,详见3.2.2节。
(5)访问及报警信息的上链:当用户开锁或触发入侵警报时,BGU发布包含访问或报警信息的交易,详见3.2.3节。
(6)家庭成员通过客户端对门禁进行操作,合约根据链上存储的访问控制策略判别用户是否具有相应权限,详见3.2.4节。
(7)服务提供商在维护与检测中发现系统存在漏洞或业务需求的增加时,需对合约进行升级,合约所有者将新合约进行云存储,并返回索引nc_url。同时,合约触发投票事件通知审核节点进行链下审核。审核节点调用合约进行投票,当票数超过阈值,所有者获得升级许可并完成升级,详见3.2.5节。
3 监控系统功能与算法设计
在上文提出的基本框架以及大致工作流程的基础上,本节详细设计了门禁监控系统,主要目的是利用硬件模块和智能合约实现门禁访问以及入侵的可信监控平台。
3.1 智能门禁设计
指纹识别子程序用于接收指纹识别模块读取的指纹特征,并判断指纹是否注册,工作流程如图2所示。指纹识别模块通过USART1与Arduino相连,当USART1串口出现中断,系统接收串口信息,并判断用户身份是否注册,如果与链下指纹库中的指纹比对成功则开启门禁,同时BGU接收到发送来的访问信息后,调用合约发布包含门禁访问信息的交易;如果指纹比对失败且失败次数超过阈值n,则BGU发布包含门禁访问报警信息的交易。此外,当系统检测到链下指纹库为空时,提示用户使用其它方式开启门禁,并且当用户成功使用其它方式开启门禁后BGU调用合约完成链下指纹库同步。
图2 指纹身份识别流程
密码识别子程序用于实现用户使用密码开启门禁和注册指纹信息,工作流程如图3所示。当密码按键模块检测到密码输入时,首先进行链下验证,若链下没有验证信息,则通过BGU调用合约验证输入的密码与链上存储的密码hash值是否一致,若检测到是管理员密码,则提示选择注册还是注销指纹模板,若注册则通过指纹模块读取指纹,当两次指纹一致则存储指纹模板,同时BGU调用合约将加密后的指纹模板进行上链存储;若注销则提示通过客户端操作。但是当检测到是正确密码或临时密码则开启门禁,并通过BGU发布包含访问信息的交易,而临时密码则会在使用后被立即删除。当输错次数超过阈值n则发出报警提示,并发布包含访问报警信息的交易。
图3 密码身份识别流程
入侵检测子程序如图4所示。当人体红外传感器感应到人员出现则开启超声波测距,若测量到人与门禁之间的距离≤阈值d时,开始计时。若操作者在设定时间t内未对门禁做出正确操作,则门禁判定发生室外入侵,广播包含室外报警信息的交易。
图4 入侵检测流程
当入侵者试图绕过门禁入侵室内时,若门禁处于锁定状态,设置在室内多处的运动传感器会检测到室内入侵,当相邻时间内接收到多处运动传感器发送的数据,则判断为室内入侵,BGU将包含室内入侵报警信息的交易进行广播。
而当系统判定为入侵时,在将报警信息上链的同时自动删除链下用户身份特征,只有当用户通过密码身份完成链上识别开启门禁时,链下才会重新同步用户身份特征,一定程度上避免了暴力获取链下数据的事件发生。
3.2 智能合约设计
在基于区块链和智能合约的智能门禁体系结构中,智能合约设计了所有交易的处理逻辑。客户端以及BGU通过Web3调用合约接口。下面对系统中的房屋登记、身份录入、访问与入侵检测、客户端访问监控、合约升级5个过程进行阐述。
3.2.1 房屋登记
房屋登记是指用户身份验证成功后用户提交一个包含房屋相关信息的记账交易,将必要的房屋信息上链存储,防止外部网关对数据的恶意修改,具体过程见算法1。该算法由注册用户执行,输入参数为用户以太坊公钥地址user_addr、房屋识别号homeID、网关设备标识号gateID、网关的以太坊公钥pk_g、登记者的私钥签名sig_r。交易返回响应信息true/false。
算法1:房屋登记算法
Input:user_addr,homeID,gateID,pk_g,sig_r
Output: 响应信息true/false
(1)调用合约home_register(homeID,gateID,pk_g,sig_r)函数, 将房屋信息加入home[homeID] 变量
(2)if verify_user(user_addr) &&homeID&&gateIDthen
(3) 合约通过personHome和gateHome变量记录房屋与用户以及房屋与网关之间的关系
(4) 初始化成员名单,将登记者加入到成员名单中,并将角色变量修改为户主
(5) return true
(6)else return false
(7)end if
用户注册身份通过后,可以调用合约home_register()函数将房屋信息写入区块链,合约通过verify_user()验证用户是否完成认证,验证后合约判断homeID和gateID的登记状况,若未登记则调用home_register()将信息记录到home[homeID]指向的Home结构体中,并将房屋与用户以及网关之间的映射关系分别记录到personHome[user_addr]和gateHome[gateID]变量中。同时,合约初始化一个成员名单member[homeID]并将登记者加入其中,然后合约修改member[homeID][user_addr].role变量,将登记者的角色变为户主。随后户主可以调用合约添加成员,方便成员访问房屋信息。
3.2.2 身份录入
在执行该过程的前提是房屋已完成登记,房屋与BGU绑定后就可以实现门禁密码及指纹的存储,该过程见算法2。该算法由户主执行,输入参数为用户以太坊地址user_addr、房屋识别号homeID、网关设备唯一标识号gateID、管理员密码的hash值admin_hash、门禁密码的hash值pwd_hash、对称加密后的指纹特征 [finger_tmp]sk_g、 网关以太坊公钥加密后的密钥[sk_g]pk_g。
算法2:身份录入
Input:user_addr,homeID,gateID,admin_hash,pwd_hash,[finger_tmp]sk_g,[sk_g]pk_g
(1)户主调用合约接口set_pwd(homeID,admin_hash,pwd_hash)
(2)if verify_role(user_addr,homeID)=UserRole.admin then
(3) 合约将门禁的admin_hash以及pwd_hash存入acc_admin[homeID]和acc_pwd[homeID]变量中
(4)end if
(5)通过指纹模块录入指纹特征, 网关调用合约addFinger(gateID,[finger_tmp]sk_g,[sk_g]pk_g)函数, 将指纹特征记录到变量temporaryFinger[homeID]中
(6)if verify_gate(gateID) then
(7) 触发合约绑定事件bind(homeID,[finger_tmp]sk_g)
(8) 户主调用合约bindFinger(homeID,user_addr,[finger_tmp]sk_g)函数绑定成员与指纹之间的关系, 记录到成员结构信息中
(9)end if
在完成房屋登记后,户主调用合约set_pwd()函数创建门禁管理员密码和开锁密码。合约内部执行vertify_role()函数验证用户户主角色,通过后密码的hash值分别存入acc_pwd[homeID]和acc_admin[homeID]变量中。户主在密码按键识别模块上通过管理员密码录入用户指纹模板,网关将加密后的指纹模板上链并触发绑定事件,同时合约验证该网关是否登记。监听该事件的户主通过客户端调用合约bingFinger()将指纹模板与用户进行绑定。
3.2.3 访问与入侵检测
算法3由区块链网关执行,输入参数为设备标识gateID、门禁访问或报警类型typeacc、信息Infoacc及其hash值Infoacc_hash、网关的签名sig_g。
算法3:访问与入侵记录
Input:gateID,typeacc,Infoacc,Infoacc_hash,sig_g
(1)网关调用合约up_data(gateID,typeacc,Infoacc,Infoacc_hash,sig_g)上传记录的相关信息
(2)if verify_gate(gateID) then
(3) iftypeacc为访问 then
(4) 合约将访问信息存入Access[gateHome[gateID]]变量中
(5) else
(6) 合约将报警相关信息存入Alarm[gateHome[gateID]]变量中
(7) end if
(8)end if
网关通过门禁的身份识别模块或入侵检测模块获得相应的参数后,调用合约up_data()接口创建包含门禁访问或报警信息的交易。合约内部利用verify_gate()验证网关身份,通过后合约根据typeacc将门禁信息存入相应的变量中。
3.2.4 访问监控
该过程为用户通过客户端实现对门禁访问记录的查询以及发布门禁临时密码等操作。本文采用基于角色的访问控制(RBAC)机制实现用户的访问控制,当用户调用合约obtain_msg(user_addr,homeID,param) 对门禁记录进行查询,合约内部调用verify_role()验证用户角色是否具有与检索信息相对应的权限,若通过则返回查询信息。而当用户发布临时密码时,调用合约publish_tpwd(user_addr,homeID,tpwd_hash,time) 创建发布临时密码的交易,合约内部调用verify_role()验证是否具有户主角色,若是户主则将临时密码的hash值tpwd_hash与有效时长time存储到变量homeTep[homeID]指向的TempPwd结构体中。
3.2.5 合约升级
智能合约作为运行在区块链上的代码,具有不可篡改的特点,这使数据的安全性得到有效保障的同时使得合约一旦部署就不可修改,这就给修复系统bug或引入新功能带来了困难[13]。因此本文利用Zeppelin社区提出的一种代理合约实现新合约的部署,以实现合约升级的目的。该合约引入了代理所有权(本文就是合约所有者)的概念,只有所有者有权将新版本合约写入代理合约中。当所有者获取升级许可时,调用合约updateTo(new_implementaddr) 函数传入新合约部署后的合约地址new_implementaddr,合约内部验证new_implementaddr与storage[position]变量存储的旧合约地址是否重合,其中position为一个常量,通过keccak256提供一个足够随机的存储位置。验证通过后,设置新的合约地址存储到storage[position]变量中,从而实现用户通过代理合约对新逻辑合约的调用。
通过代理合约调用函数来返回逻辑合约的值,该操作通过solidity的汇编操作码实现,当调用的函数在合约中不存在时,合约调用fallback回退函数将请求重定向到其它合约中。而fallback函数通过calldatasize将收到的msg.data传递给目标合约,然后通过delegatecalls操作码返回调用结果。然而,所有者在实现合约升级的同时也为去中心化环境带来了风险,因此本系统通过投票机制限制所有对合约升级的许可,见算法4。输入参数为合约所有者的以太坊地址owner_addr、合约索引nc_url、索引的hash值url_hash、新合约的hash值nc_hash、审核节点的地址user_addr。
算法4:升级许可
Input:owner_addr,nc_url,url_hash,nc_hash,user_addr
(1)合约所有者调用合约release_nc(owner_addr,nc_url,url_hash,nc_hash)函数
(2)ifowner_addr不是所有者 then
(3) 抛出异常
(4)end if
(5)将新合约的信息存入nc[nc_hash]变量中
(6)触发投票事件vote(nc_url,url_hash), 审核节点链下审计新的合约代码
(7) while(rel_nc[url_hash].voteNum (8) if 审核通过 then (9) 审核节点调用vote_nc(user_addr,url_hash)函数投票 (10) ifuser_addr是审核节点&&vote_status[user_addr][url_hash]=false (11)rel_nc[url_hash].voteNum++,vote_status[user_addr][url_hash]=true (12) end if (13) end if (14)end while (15)ifrel_nc[url_hash].voteNum≥preset_numthen (16)upgrade_status=true (17)end if 为避免合约所有者恶意行为的发生,合约所有者owner在升级新合约前需要将合约发送到云端进行审核。然后owner调用release_nc()发布合约审核请求,并触发合约的投票事件。监听该事件的审核节点链下审计合约,通过后调用合约vote_nc()函数增加rel_nc[url_hash].voteNum的票数,vote_status[user_addr][url_hash]限制了节点不可重复投票,并且当在preset_time时间内票数达到预设值preset_num,则合约修改升级许可的状态变量upgrade_status。 本文使用运行Ubuntu20.04系统的PC以及Raspbian系统的树莓派4B进行实验。同时,该系统基于Truffle框架进行开发,采用Solidity编写智能合约,运行在利用Geth(go-ethereum)搭建的基于PoA共识的以太坊私有网络中,并在私有网络中设置5个节点,其中本地PC上通过不同端口模拟3个用户访问的测试节点和1个挖矿节点,此外树莓派上同样部署Geth作为网关测试节点,然后通过Geth控制终端将网关的节点信息加入到本地跟踪的节点列表,本地节点将保持与这些节点连接,实现局部的P2P私有网络,保证网络中的各节点进行同步与验证。 本实验针对上述门禁监控系统中指纹模板的存储、同步以及密码的识别效率进行测试。在指纹模板存储与同步测试中采用10个指纹模板,模板链上存储与链下同步的结果如图5所示。其中指纹模板每次录入一个就会直接上链存储,而链下同步模板数由一个逐次递增,同步数最多为10个,符合实际需求。从图中可以看出存储的平均处理时间基本稳定在某一范围,而同步的延时与同步的模板数呈正比,二者的处理效率用户完全可以接受。而且随着节点增加也不会导致处理效率的下降,这完全得益于PoA共识算法只需事先选取部分权威节点处理交易的特点,而传统的PoW(Proof-of-Work)共识算法需要将交易信息广播到所有节点,并且随着节点的增加耗时更久,这就使得PoA的处理效率要远优于PoW,同时基于PoA的私有网络更有利于及时向用户反馈结果。 由于智能合约的局限性很难实现链上指纹的身份识别,因此在实际情况中,当链下身份数据被删除时,就可以使用密码身份识别进行链上验证,图6展示了链上链下密码身份识别的效率,其中左侧纵坐标为链上验证的响应时间,右侧纵坐标为链下验证的响应时间。从图中可知,链下识别的效率要明显优于链上识别,但是链上密码身份识别的效率稳定而且也基本满足实际需求。 图5 指纹模板存储与同步效率 图6 密码身份识别效率 本文通过Remix对合约的升级功能进行测试,在保证原有数据不变的情况下实现原始合约的升级。实验设计了一个逻辑合约EGSystem.sol,通过房屋登记功能测试合约的升级效果。首先分别部署升级合约Upgradeability.sol和逻辑合约EGSystem.sol,然后调用Upgradeability.sol中的upgradeTo()函数传入原始逻辑合约地址,接着重新载入Upgradeabilidy.sol的合约地址,最后利用Upgradeablidity.sol调用EGSystem.sol中的home_register()函数登记房屋信息。 经测试,在重新登记已登记过的房屋信息时,提示当前房屋信息以登记,如图7所示,说明房屋登记功能可以正常调用。 图7 房屋登记功能测试 当原始合约已无法满足当前系统的需求时,假设所有者已获得升级许可,部署新的逻辑合约EGSystemV2.sol,然后调用Upgradeability.sol的upgradeTo()函数传入新合约的地址并重新载入升级合约的地址完成升级。 测试如图8所示,合约成功的由原始逻辑合约升级为新的合约,在保证合约功能和数据续用的前提下,实现了合约的升级。 图8 合约升级测试 智能门禁监控系统旨在于用户通过客户端实现对智能门禁的监测以及控制,本系统采用Web3.js以及JavaScript等技术实现客户端界面。如图9所示为用户通过检索参数查询到的某天门禁访问的信息,其中包含访问时间、开锁方式、相应用户等信息。 图9 门禁记录查询界面 本文针对智能门禁系统中用户生物特征易被盗取、监控数据易被外部篡改等问题,设计了一个基于以太坊区块链的智能门禁监控系统。该系统利用智能合约实现门禁访问身份的可信存储与识别以及监控数据的固化,并且配合链下链上的多方式身份识别有效提升用户的访问效率,同时入侵检测单元确保了室内外入侵能够被立即检测到,而且合约的可升级保证了对系统漏洞的及时修复以及提升系统的可扩展性,实现用户对监测数据的有效管理。实验结果表明,系统性能可以达到实际应用所需效果。4 测试分析
4.1 对比分析
4.2 合约升级测试
4.3 系统实现
5 结束语