一种抗二维码盗用的离线安全支付系统及方法
技术领域
本发明属于信息安全技术领域,设计一种离线安全支付系统及方法,具体涉及一种基于手机应用防攻击机制与身份数字签名的移动通信加密技术的抗二维码盗用的离线安全支付系统及方法。
背景技术
随着移动支付时代的到来,越来越多的移动支付行业方兴未艾,如今移动机支付已经成为人们生活中不可或缺的一部分。据中国支付清算协会发布的《中国支付清算行业运行报告(2018)》显示,2017年非银行支付机构互联网支付和移动支付业务金额占网络支付总业务金额的比重分别为26.9%和73.1%,2017年新兴支付业务继续保持快速增长,移动支付业务规模延续高速增长态势。仅在2017年前三季度,中国的移动支付交易额就高达149.15万亿元(约22.7万亿美元),已经远超美国及西欧国家2021年的交易预估值总量。在移动互联网支付中的很大一部分消费者都选择使用手机完成日常生活中的支付需求。早在2011年,支付宝便推出条码付业务,此后扫码支付稳步发展。2016年扫码支付实现年增长率约为1038%的超高速增长。根据某公司发布的《2017年中国第三方支付市场监测报告》称,在各种手机支付方式中,扫码支付已经进入超高速增长期,仅通过16年的数据来看,扫码支付季度环比增长率远高于第三方支付总体规模的季度环比增长率,已然成为第三方支付新主力。
然而根据中国银联公开的信息显示,在移动支付领域迅速崛起的同时,互联网移动支付领域犯罪量大幅增加,通过社交网络平台、欺诈APP软件、恶意二维码等进行盗刷、诈骗的案件频发。在业内人士看来,移动支付安全已经成为用户最担心的问题之一。若想尽最大努力避免风险事件,需要注意的地方有很多:
(1)设备安全:在进行支付操作时,支付APP无法检测设备安全问题;
(2)信息盗取:支付信息在传输过中被盗取利用;
(3)信息真实性:支付信息来源的真实性问题,收款方无法对付款者进行身份信息审核,即判定是否本人操作。
值得注意的是,现阶段的移动支付安全领域并没有取得明显的进步。若想解决以上问题,不能只依靠法律约束,随着移动支付规模的不断扩大,越来越需要一款能够再支付安全方面依然表现优异的支付APP以及其相对应的安全支付系统及方法。
发明内容
为了解决上述技术问题,本发明提出了一种抗二维码盗用的离线安全支付系统及方法。
本发明的系统所采用的技术方案是:一种抗二维码盗用的离线安全支付系统,其特征在于:包括支付端、收款端、服务器端;
所述支付端用于提供个人用户的支付信息,包含有相应的用户个人身份信息、时间戳信息以及账户信息,同时用于对相应付款信息进行加密和支付异常提醒;所述收款端用于接受付款方的支付信息,并且对加密付款码进行解密认证操作、向服务器端发送收款请求和向服务器端报告异常支付信息;所述服务器端用于对收集到的支付信息、用户信息以及相关的异常支付信息存储并进行实施处理。
本发明的方法所采用的技术方案是:一种抗二维码盗用的离线安全支付方法,其特征在于,包括以下步骤:
步骤1:支付端和收款端每间隔一定时间,自动从服务器端获取重排序的种子,利用种子生成新的原始编码字符串,该字符串用于加密原始付款码;
步骤2:收款端生成公钥身份信息;
步骤3:支付端加密付款码;
步骤4:收款端解密付款码;
步骤5:收款端发起收款请求;
步骤6:服务器端端验证收款码;
步骤7:收款端正常收款或上报异常支付;
步骤8:支付端拉取异常支付信息并反馈。
本发明相比现有技术,其优点和积极效果主要体现在以下几个方面:
(1)针对身份认证漏洞,设计并实现了完整的防护系统。本系统面向市面上绝大多数支付软件,屏蔽了其支付系统服务器的实现细节,在保留全部现有功能的前提下,从收付款客户端着手改进,实现了双重验证的安全支付;
(2)本系统提供异常支付提醒模块,从消费者、商家、服务提供商多方面多维度提升系统安全性,有利于整合离散的异常信息,借助信息安全相关专业的力量及时发现并解除安全隐患;
(3)借助Android系统的进程运行信息和Activity生命周期特点,本系统创新地提出了基于进程运行状态和Activity生命周期的屏幕恶意覆盖的自动化检测技术,实现了付款APP的自我保护;
(4)基于设备标识的双重验证安全支付协议,利用RSA加密算法进行身份验证,实现具有身份信息确认的支付方式,解决了离线支付的信息审核问题;
(5)支持动态重排的编码方式用于加密信息编码,增加非法攻击者通过基于特征的密码分析方法获取加密数据的难度,降低了被破译风险。
附图说明
图1为本发明实施例的系统架构图;
图2为本发明实施例的收款端模块部署图;
图3为本发明实施例的支付端功能模块部署图;
图4为本发明实施例的服务器端功能模块部署图;
图5为本发明实施例的方法原理图。
具体实施方式
为了便于本领域普通技术人员理解和实施本发明,下面结合附图及实施例对本发明作进一步的详细描述,应当理解,此处所描述的实施示例仅用于说明和解释本发明,并不用于限定本发明。
请见图1,本发明提供的一种抗二维码盗用的离线安全支付系统,包括支付端、收款端、服务器端;
支付端用于提供个人用户的支付信息,包含有相应的用户个人身份信息、时间戳信息以及账户信息,同时用于对相应付款信息进行加密和支付异常提醒;收款端用于接受付款方的支付信息,并且对加密付款码进行解密认证操作、向服务器端发送收款请求和向服务器端报告异常支付信息;所述服务器端用于对收集到的支付信息、用户信息以及相关的异常支付信息存储并进行实施处理;服务器端在现有成熟的支付系统上添加数个简单可行的接口。
详细系统部署图见图2、图3、图4。
图2为本实施例的收款端模块部署图,包括登录界面、主程序界面、收款功能、POS机身份信息;
图3为本实施例的支付端功能模块部署图,包括登录退出功能、异常提醒功能、自动检测功能、二维码扫描功能、付款界面展示功能、账单查询功能;
图4为本实施例的服务器端功能模块部署图,包括用户登录功能、用户退出功能、用户信息查询功能、异常支付拉取功能、异常支付推送功能、用户异常反馈功能、账单查询功能、支付请求功能。
请见图5,本实施例提供的一种抗二维码盗用的离线安全支付方法,包括以下步骤:
步骤1:支付端和收款端每间隔一定时间,自动从服务器端获取重排序的种子,利用种子生成新的原始编码字符串,该字符串用于加密原始付款码;
本实施例通过凯撒算法等利用种子生成新的原始编码字符串。其中,种子必须支持离线生成,可利用离线付款码的生成原理,生成多端可同步使用种子;同样支持其他可多端同步的种子生成算法。
步骤2:收款端生成公钥身份信息;
本实施例利用RSA算法,将生成的公钥信息进行base64编码,并利用二维码展示,作为收款端的身份信息供支付端使用。
请见表1,两个随机生成选择的大素数p、q,而且保密,计算n=p*q,将n公开,计算对保密,随机生成加密指数e,保证且并将e公开。根据计算出d,并对d保密;公开加密钥Ke即为<n,e>,保密解密钥Kd为 公钥信息即包含n和e两个数值,将其进行Base64编码,并利用二维码展示,作为收款端的身份信息供支付端使用。
RSA具体算法步骤如下:
步骤2.1:寻找两个不相同的质数;随意选择两个大的质数p和q,p不等于q,计算N=p*q;
步骤2.2:根据欧拉函数获取r;欧拉函数是小于或等于N的正整数中与N互质的数的数目;
步骤2.3:选择一个小于r并与r互质的整数e;选择一个小于r并与r互质的整数e,求得e关于r的模反元素,命名为d(ed=1(mod r)模反元素存在,当且仅当e与r互质),e本实施例通常取65537。模反元素是指,如果两个正整数a和n互质,那么一定可以找到整数b,使得ab-1被n整除,或者说ab被n除的余数是1;
步骤2.4:销毁p和q;此时本实施例的(N,e)是公钥,(N,d)为私钥,一对公钥和私钥就产生了。
步骤3:支付端加密付款码;
本实施例中,支付端加密付款码,使用扫码功能,获取收款端的身份信息,结合usrId(即用户唯一身份标识)、付款码和收款端的身份信息,生成加密后的付款码,生成二维码供支付使用。
生成加密后的付款码,具体过程包括以下步骤:
步骤3.1:输入字符串usrId(用户唯一身份标识)、payCode(原始付款码,即目前已普遍应用的离线付款码)、publicKey(公钥);
步骤3.2:在payCode末尾添加若干位验证位,取自publicKey公钥Base64编码后字符串中的若干个数字,最少可能没有数字;
步骤3.3:利用RSA算法及公钥publicKey加密payCode;
步骤3.4:usrId和加密后的payCode以usrId在前,payCode在后的方式逐位混合,混合之后的结果是usrId在奇数位,payCode在偶数位;
步骤3.5:当混合操作完成之后,usrId以0作为结束标志位,其后所有位均为加密后的payCode剩余位;
步骤3.6:在9组特定两位数字(例如两个连续相同数字11、22、33、44、55等)之间,添加一组预先规定的两位数字分割;
步骤3.7:当此时数字串长度为奇数时,在末尾添加一位预先规定的数字,补全字符串为偶数长度;
步骤3.8:按照预定义91个ASCII码字符顺序(即步骤1中生成的原始编码字符串),将每两个数字编码为一个字符,两个数字一组(组成不含特定数字共计9个数的91个下标组合)即为字符的对应下标;
步骤3.9:步骤3.7中是否补全字符串为偶数长度,是则末尾置补全偶数长度标志位;
步骤3.10:得到编码后的字符串,长度减少为原来的1/2,并能有效减少编码特征。
步骤4:收款端解密付款码;
本实施例中,收款端利用POS机、扫码枪等外设,获取付款端离线支付二维码中的加密后的付款码信息,并利用“步骤1中生成的原始编码字符串”,结合加密后的付款码、收款端的公私钥身份信息等,解密并验证付款码和付款者的身份信息,从而达到第一重验证的目的。
对加密后的付款码进行解密,具体过程包括以下步骤:
步骤4.1:输入字符串encodeString(加密后的付款码)、publicKey(公钥)、privateKey(私钥);
步骤4.2:检查是否包含补全偶数长度标志位,如果是,则设置isNotAPPendZero(是否未在字符串末尾添0标识)为假,并减少一个单位的encodeString(加密后的付款码)长度;
步骤4.3:根据编码时预定义91个ASCII码字符顺序,将每一个字符编译成两个数字,数字即为字符的对应下标;
步骤4.4:isNotAPPendZore标志是否为真,不为真,则去掉补全偶数的末尾数字;
步骤4.5:从第2个数开始遍历数字串,删除所有的分割9组特定两位数字的一组预先规定的两位数字;
步骤4.6:以usrId在奇数位,payCode在偶数位的方式,逐位解析usrId和加密后的付款码payCode,直至扫描到usrId的结束位0为止;
步骤4.7:检验付款码中的验证位是否与公钥匹配,若匹配,则返回usrId和payCode集合;反之,返回usrId和payCode错误信息。
步骤5:收款端发起收款请求;
本实施例中,验证付款码合法后,收款端向服务器发送收款请求,包含收款金额、收款内容、付款码、付款者身份等相关信息,并等待服务器端的验证反馈。
步骤6:服务器端端验证收款码;
本实施例中,服务器端收到来自收款端发送的收款请求,验证付款码的合法性和有效性。如果检测到是合法有效的付款码,则向收款端发送接受收款请求反馈,并进行相应的交易结算处理;如果检测到是非法付款码,则向收款端发送拒绝收款反馈,并要求收款端上传支付时间、支付地点等相关数据。从而达到第二重验证的目的。
步骤7:收款端正常收款或上报异常支付;
本实施例中,如果收款端接收到来自服务器端的接受收款请求的反馈,则显示完成收款操作;如果收款端接收到来自服务器端的拒绝收款的反馈,则显示收款失败,并按照服务器端的要求,上传支付时间、支付地点等相关数据。然后,便可进行下一次收款操作。
步骤8:支付端拉取异常支付信息并反馈。
当离线的支付端设备再次联网,支付端主动拉取服务器端的异常支付数据,并提醒用户在何时何地发生了何笔可能出现异常的支付,用户点击了解详情并反馈。支付端拉取异常支付信息并反馈给用户的功能,是用于提醒用户出现过的异常支付操作,用户了解详情并作出相应防护操作,最终实现出完整的具有安全保障的支付过程。
本实施例面向移动终端屏幕恶意覆盖的自动化检测技术(该技术应用于支付阶段的付款码展示页面),利用Android底层进程数据,判断活动栈栈顶Activity是否合法,并实时反馈给用户,保证付款码安全。
面向移动终端屏幕恶意覆盖的自动化检测技术,需要获取到当前运行的应用程序列表。但是从Android Lollipop开始,函数getRecentTasks将只返回当前启动的应用程序,现在主流Android系统无法使用ActivityManager.getRecentTasks()方法来获取当前运行的应用程序列表。因此,如今我们已无法从系统级API获取到当前位于前台运行的应用程序包名。故我们成功通过对系统文件夹proc目录的读取实现了相关功能。
面向移动终端屏幕恶意覆盖的自动化检测技术,主要包含以下两种方式:
其一是前台进程检测,主要流程:
步骤1:遍历/proc目录下所有文件夹,文件夹名即为pid;proc下以数字命名的文件夹,文件夹名即是一个进程的pid,该文件夹下的文件包含这个进程的信息。
步骤2:读取/proc/{pid}/cgroup文件里的cpu和cpuacct两行数据;cgroup,控制组群(control groups)的简写,是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等)。cpu:设置cpu的使用率;cpuacct:记录cpu的统计信息。
步骤3:判断cpuacct的内容,若不是非应用程序和bg_non_interactive,则进入下一步;bg_non_interactive,运行cpu的一个分组,另一分组是APPs,当一个应用(进程)即可从APPs分组切换到bg_non_interactive,也可以切换回来。APPs分组可以利用95%的cpu,而bg_non_interactive只能使用大约5%。
步骤4:读取/proc/{pid}/cmdline文件里的数据,检测pid对应的程序包名,确定其是非系统进程;cmdline,是显示内核启动的命令行。
步骤5:读取/proc/{pid}/oom_score文件的数据,当oom_score值最小时,即为当前的前台进程;oom_score_adj,这个文件的数值用来标记在内存不足的情况下,启发式的选择哪个进程被杀掉,值从0(从不被杀掉)到1000(总是被杀掉)。
步骤6:当检测到前台进程非SecPay进程时,将触发条形码、二维码的隐藏,并提醒用户“程序检测到APP可能出现异常行为。请确认无误后,点击屏幕重新显示二维码”。
其二是Activity生命周期引发的二维码隐藏的实现,主要流程:
步骤1:任何引发付款码Activity的onPause生命周期的行为,都将触发条形码、二维码的隐藏,并提醒用户“程序检测到APP可能出现异常行为。请确认无误后,点击屏幕重新显示二维码”。
步骤2:当用户点击屏幕,触发点击事件回调,重新显示条形码和二维码。
本实施例支持动态重排的编码方式是利用ASCII码中的92种可见字符、可有效缩短字符串长度的编码方式,并支持多端原始顺序编码字符串动态重排并验证。
本发明付款端在现有的支付APP基础上增添了异常响应机制以及RSA公钥加密功能;收款端则通过自主设计的支持动态重排的编码方式对身份信息进行加密,通过RSA得到公私钥对实现离线状态下双向身份验证。本发明从根本上解决付款二维码单向认证的不足,有效防止了不法分子通过调用前置摄像头等方式获取用户付款码并进行异地支付,从而给用户造成的不必要的财产损失。
应当理解的是,本说明书未详细阐述的部分均属于现有技术。
应当理解的是,上述针对较佳实施例的描述较为详细,并不能因此而认为是对本发明专利保护范围的限制,本领域的普通技术人员在本发明的启示下,在不脱离本发明权利要求所保护的范围情况下,还可以做出替换或变形,均落入本发明的保护范围之内,本发明的请求保护范围应以所附权利要求为准。