一种新的支付技术---自定义双向动态密码介绍

来源:互联网 发布:网络流行用语2017 编辑:程序博客网 时间:2024/05/19 23:24

       长期以来,在密码领域,消费者一直使用传统固定密码方式,随着互联网和金融的发达,随之带来的安全问题也日益突出,为提高账户安全性,各种安全设备如U盾,手机短信验证等也涌现出来,这虽然部分上提高了安全性,但也带来了严重依赖外部设备的不便性和各种新的风险,如遗失风险、系统漏洞风险、应用程序漏洞风险、病毒风险、SIM卡被异地注销等风险。

       还有一些利用生物特征来验证的密码系统认证,如指纹验证,视网膜验证等,其实从本质上说也是传统固定密码的范畴,而且它一旦泄漏,更容易悲剧,不但隐私信息被泄露,而且无法再更改,因为这些生物特征是用户特有的。

       密码体系的脆弱性和依赖性的主要原因是,人的大脑始终只是起到简单存储器的作用,而没有起到应有的CPU运算器功能,用户对于自己密码的安全没有太多的选择权。所以在输入密码时,原密码信息很容易被复制和传播。

       这里介绍一种动态密码技术,它可以看作是传统固定密码的升级,实现有点类似手机上的九宫格方式密码,不同的是它更加灵活强大,支持用户自定义的规则,它允许用户通过数字“随机”数字矩阵自定义算法规则,来动态生成部分或者全部密码,相关的规则信息可以仅保存在用户自己的大脑里,即使仅通过它设定极为简单易记的规则,其安全性也能比传统固定密码高很多。从而大大降低了被拦截窥视和钓鱼的风险。这里说的“随机”数字矩阵,指的是系统默认是随机生成,但用户也可以干预,按照自己的意愿来生成一些值,从而达到双向验证或者辅助计算目的。

       用它甚至可以在他人或不太安全的设备或者环境(如免费的WIFI的公众场合)里进行交易操作。(相关模拟和学习软件可以在本文后面的给的网址中下载),动态密码技术可以广泛应用在手机支付、网银交易、游戏、POS机刷卡、ATM机等各个领域。


它的主要特点有:

  • 表达式既简单高效又灵活丰富,易于学习、记忆。
  • 可以动态和静态密码组合而成,兼顾记忆和安全。
  • 完全兼容传统的固定密码方式。对于不想使用的传统用户来说,一点也不受影响。
  • 用户可以根据自己需求来自主选择其帐号的安全性高低,从低到高,完全由用户自己决定。

实现方式:

1.      用户进行登录或者交易时,系统根据用户信息,会生成类似随机的数字矩阵返回给用户

2.      用户根据设定的的规则,结合数字矩阵,算出相应的动态密码。

3.      输入相应的密码,完成认证。

 

       当在电脑或者智能设备上时可能的登录或者交易界面类似如下

  

 

       以下通过几个简单例子来快速初步了解一下。(以3X3的九宫格为例)


例1:假如我想设定的密码规则为矩阵中的对角线上的值,无静态密码,则规则可以表示为

对应位置示意如下图

 


则上述规则可以简单表示为

R1R2R3=$1$5$9

说明一下,用户输入的密码用R表示,第一位为R1,第二位为R2,以此类推

$表示初始矩阵上的元素,$1表示第一个,$2表示第二个,依次类推。3x3时,


因此当系统弹出的初始码矩阵如下时

则此时密码是:841

       图中已经用红色特别标出。这个例子密码中所有都是根据初始矩阵动态得来的,没有包含静态密码,动态密码也没有任何运算符,很简单。

当系统弹出的初始码矩阵又如下时

则密码为:753

 

 

例2:某用户原来的固定密码为25ABCDE  ,现在他稍微改造一下,把第一、二位数字分别加上矩阵上的$1,$9两个值.后面则不变。

示意如下图



R3及之后均为原来的固定密码,此时规则可以表示为:

R1=2+$1

R2=5+$9

R-=ABCDE

R-表示除了已经指定值后的剩余部分,这里是从密码的第三位开始到第七位,这是一种简化表示。


因此当系统弹出的初始码矩阵如下时

因此密码第一位 R1=2+$1=2+8=10 按赋值对齐原则,取个位数0,所以R1=0

R2=5+$9 = 5+1=6

所以则此时密码是:06ABCDE

 

       说明一下,R-则为所有静态密码的简单表示法,表示所有的静态密码部分,也就是除了已经设定动态规则的后从前到后排列的所有静态码。

       例如用户对第1位,第2位设定了表达式(如R1=$2;R2=$9),然后再加一个R-=abc,表示密码的第3,4,5位为静态密码abc.

又如,用户对第1位,第3位设定了表达式(如R1=$2;R3=$9),然后再加一个R-=abc,表示密码的第2,4,5位静态密码abc。

 

 

例3:当用户设定的如下规则(斜体字部分表示注释,并非规则)

R3R1=$1X3+$9   //注,为了显示效果,乘号用X而不是实际使用的*代替

R-=k5ABCDE    //注:由于R1,R3都已经有规则,所以R-对应为24-9

 

当系统弹出的初始码矩阵如下时 

代入公式可得

R3R1=$1X3+$9 =8X3+1=25 //–> R3=2 ,R1=5 

因此密码是:5k25ABCDE


       为了便于记忆和书写,这里有个赋值对齐规则,R3R1,表示十位上的值为R3 ,个位上为R1,如R3R1=45,则R3=4,R1=5.

       又如R3R1=157,则 R3=5,R1=7,百位上则忽略。对赋值操作实行对齐原则,它的好处是直观简单,利于快速心算,同时也由于执行了简单的信息单向变换操作,提升了安全性,有利于防止规则被逆向工程破解。初始码也可以直接组合,如$4$3等价于 $4*10 + $3。

 

如用户规则为

R1=$1+$2  //R1=8+6=14 –>按对齐原则,R1=4

R-=ABCD1

则当矩阵为上图时,密码为4ABCD1

 

例4:当用户设定的如下规则,图形线条为助记符,一般来说人类对于的图形的记忆远强于对数字的记忆。

R1=$1+$5 //如红色部分

R2=$9+$6  //如蓝色部分

R-=ABCD1


当初始码矩阵为右上图时,

则密码为: 27ABCD1

 

例5:使用动态变址来设定规则,假定只有一个动态码

R1=$($7)+5 //注,这次值的下标是根据$7上的值动态变化

R-=ABCD1

 

 

 

此时R1上取值根据$7位置上的值动态变化。$7为2时,则取第二个值。

当初始码矩阵如图5.2时,则等价于R1=$($7)+5 = $(2)+5 =6+5 = 1 (舍弃十位数)

则密码为:1ABCD1

当初始码矩阵如图5.3时,则等价于R1=$($7)+5 = $(6)+5 =3+5 = 8

则密码为:8ABCD1


       这个密码的安全性已经远高于上述其它例子了。注意$()里面可以为一个值,也可以为一个合法的值表达式,支持层层嵌套。如用户想R1是想根据第4位置上值来决定从第一行中的某个位置取出。则规则如下

R1 = $( $4 %3 + 1)  //%是取模操作,也就是求余数。如7%2=1, 7%5=2

当$4=5时,R1=$(5 % 3 +1)=$(2+1)=$(3)

       注意:为防止数据越界,这里有个规则限定,下标超过范围时,取与其最接近的值。如$(0)等价于$1,因为下标从1开始。$(16)在九宫格时,则等价于$9。当然如果用户设计规则严谨,则完全可以避免越界发生。(通过取模再+1操作,就可以限定在范围内)。

 

例6:通过丰富的函数来设定规则

条件函数 if :

参数格式:(条件表达式,值1,值2) 说明:如果条件表达式为真,则返回值1,否则返回值2,值1,值2都可以为表达式组合。

例如,用户想根据第一个位置上的值的奇偶性来设定返回密码的第一个元素的值。奇数则返回3,偶数则返回值8,可以表示为

R1= if($1%2==1,3,8)

//注,%表示取模运算,也就是就余数。所以$1%2==1表示判断是否是奇数。

 

它也可以进行各种组合,如下

R1=if($7>6, $1, $9 X 2 )+6  //注,表示如果$7值大于6,则取$1,否则取$9X2

当初始码为图5.2时则 R1= if(2>6,8,1X9)+6 =8+6 = 4

通过多个if函数组合可以实现更多功能,如类似switch case等功能。

 

如用户想根据$7上的值来得到R1,值为0-3时,取$1 值为4-5时,取$2,否则为值6,如下表

$7

R1

0,1,2,3

S1

4,5

$2

>5

6

 

则该规则表达式可以表示为

R1=if($7<=3, $1 , if ($7<=5, $2, 6) )

关于if函数其实很有用,适当的应用可以大大提高安全性。以下举几个基本用法

If ($7 %2==0, 3, 7)//表示如果$7为偶数,则返回3,否则返回7

If ($7 %2==0, $3,7)//表示如果$7为偶数,则返回矩阵中第3个位置上的值,否则返回7

 

 

例7: 有时我们需要在某些项中找到符合需求的项,如,我想在第一列中找到一个最接近于7的值所在的位置号,再取它旁边的值作为运算项。

对应函数为:最接近数下标(posbynearest)

参数形式为: posbynearest(参考值,下标1,下标2…下标n)//注意下标参数可变,可以是一个或者多个。如果有多个值和参考值相近,则按输入参数顺序,最先匹配到的为准,返回为对应的位置号,而不是位置上的


例如

posbynearest (7,1,2,3) //表示在第一行中($1,$2,$3),找到和7最相近的数,返回该位置号。(注意是位置号,而不是对应位置上的值,所以该函数返回的结果只可能是1、2、3三个值的其中之一, 如果要取对应位置上的值,则用另外一个函数Nearest,或者前面加$, 即为$( posbynearest (7,1,2,3))  )

Posbynearest(7,1,4,7) //表示在第一列中($1,$4,$7),找到和7最相近的数,返回该位置号(1,4或者7)。

 

用户想R1的规则是从第一列中取出最接近6的值的位置,然后取后移一个位置上的值。则可以表达为

R1=$( posbynearest (6,1,4,7) + 1 )

当系统初始码界面如下时,由于第一列中最接近6的数在第一个.所以

R1=$( posbynearest (6,1,4,7) + 1 )=$(1+1) =$2 = 8

 

同样还有很多函数,如最大值,最小值,最大值所在位置,最小值所在位置,还有位置变形函数等。本文附带的程序中都支持这些函数的操作。你可以轻松查看各种函数的运行情况,以及是否与预期结果一致。

 

例8: 如果我们又需要对网站的真实性做个校验,这是我们也可以设定它的初始码矩阵的生成规则,这样我们是否是诈骗网站发过来的。例如下面的规则

$1=in(2,5,8);         //表示限定初始码矩阵的第一个元素的值只能是258

$1$4=in(12,23);   //表示限定初始码矩阵的第1,4个元素的组合值只能是12或者23

$2=$1+5;             //表示限定初始码矩阵的第2个元素的值必须为第1个元素的值加5,然后取个位上的数

 

       运算规则中的运算符不但可以是(+)(*),还可以是(/)(%)(~)等。运算中,为保证运算简单易算,所有中间结果都是整数,没有小数。

       取模(%)就是求余运算,如7%2=1 ,   7%5=2

       除(/) 返回还是整数,有余数自动忽略,另外为简化算法,当除数或被除数为0时,结果均为0。如 7/2=3 ,6/2=3 ,  5/2=2 , 4/0=0, 0/4=0

       差(~) 是指两数相减后再取绝对值,这是为了避免出现负数。如 5~6=|5-6|=1, 6~5=1, 6~2=4.

       各个规则表达式之间用分号(;)分隔,初始函数(如placeOne和delete)或者赋值给初始码元素的表达式在初始码矩阵(随机码)发给用户前就先执行完毕,如$1=$2+ 3。赋值给返回码元素项的则在之后的阶段执行,如R1=$1;.

 

       函数支持中英文两种输入,大小写不敏感,目前未提供字符串相关的函数,均为数字方式。另外,也暂不提供用于提示目的的下标名称自定义。

 

       支付手段越便捷,方便我们生活的同时,却也往往意味着“损失”可能也更便捷。这时,我们只能假定我们的各个运营商所提供的支付系统是安全的,无漏洞的,就是找到的漏洞也能够及时更新到每个用户的机器上。在微型化摄像头无处不在的今天,传统的固定密码越来越显得有些脆弱,不定期更改固定密码对于很多用户来说容易搞混,而通过使用简单的规则,则可以大大提高在POS机刷卡交易、ATM机器上取现时的安全性。

       自定义双向动态密码虽然可能无法保证账户绝对的安全,但至少在付出与传统的固定密码记忆成本相当、甚至更少的情况下,安全性就比传统固定密码大大增强,而且对于那些比较注重安全性的用户来说,他也可以轻松设计出高安全性的密码,满足各个层次用户的需求。也就是,它给了用户自主决定其帐号安全级别的权利

 

       本系统的演示、模拟软件可以在百度云上下载,用java编写的绿色小软件,无需安装和卸载,解压之后直接启动start.bat就可以运行,(注意本软件为存储和运行均为为明文方式,所以请勿保存个人敏感信息。其中,一个为纯软件本身,很小,但需要计算机里已经安装JAVA环境。另外一个则自身带JRE,较大,但可以独立运行。可以根据自身情况下载相应版本)

       系统启动主要由三个主要界面组成,即主界面,设计界面,运行界面。

 

界面类似如下

主界面

 

设计界面

 

运行界面

 

 

程序使用比较简单,不再详细描述了。

 

另外关于网站的实现方式主要有两种:

第一种是网站保存用户设计的规则,这种好处是允许用户采取更灵活的方式,如相同的初始矩阵下,可能可以允许使用多个不同的密码,防止规则不容易破解。但不利的是,网站知晓用户的规则部分,静态码部分合格的网站还是可以采用单向加密后而无法知晓。当用户将同用一个规则应用于多个网站时,风险也会增大。而且网站的密码改版相对也大,而且还得写一个编译器,虽然这仅是一个超小型的编译器。

第二种是用户利用工具预先生成大量的密码对,然后导入各个网站,这个好处就是用户可以将同一个规则应用的多个金融网站,而且各个网站也无需知晓用户的具体规则,大大提高用户的规则安全性。对于各网站来说,这种实现也是最容易实现的,具体的类似实现如下。

用户利用本文的规则(也可以是其它文法)生成大量密码对。每个密码对的组成由明文的初始码随机矩阵 和 (密码+用户识别码+初始码矩阵)再单向加密后的密码串组成。

如:当用户的其中一个初始随机码矩阵为 321449982 时,用户根据他的规则正确对应的密码是“ABCD3684",他的用户识别码为“zhang1234567”,假定这里的单向算法是MD5算法,则MD5("ABCD3684"+"zhang1234567"+"321449982")=B3EB179CD6DF810F3D586B578765852B。也就是说对于这个密码对,用户导入到网站的仅是 321449982  和 B3EB179CD6DF810F3D586B578765852B ,所以网站无需知道用户具体的规则就能执行验证操作,验证是,它只要将用户输入的密码加上用户ID加上初始码矩阵,然后取MD5和数据库中比较,就能验证用户的正确与否了。

这里加入用户ID主要是使不同的用户在相同初始码矩阵和相同的规则的情况下,存在数据库的验证码也是不同的,大大提高安全性,如果还要考虑增强安全性,可以再加入随机码串,这时上传的每个密码对就是由三部分组成了,即初始码随机矩阵、 随机生成串 、 MD5(密码+用户ID+随机生成串+初始码随机矩阵)。

对于九宫格矩阵来说,要生成数十万个完全不同的矩阵是轻而易举的事(它上限10的9次方),如果用户使用更大的矩阵,如5X5,则无疑更加安全。用户利用规则生成大量密码对后,就可以将规则本身销毁。然后把加密好的密码对再分发给各个不同的网站。

这种方式其实和传统的固定密码方式类似,区别是一个是很多组密码,一个只有一组且因为只有一个而省略了初始码矩阵而已。另外对于每个用户可以有成千上万的密码对,服务器所占的空间其实也不会多多少,运行时对服务器性能影响完全可以做到和传统固定密码类似的快捷,这种技术实现对于程序员来说应该很容易想出多种方案的,具体不再累述。(注:本演示软件暂未提供批量导出功能)


软件下载,从百度云盘:

http://pan.baidu.com/share/home?uk=3208456309 

有两个软件,一个是自带JRE版本,较大,另外一个需要机器预装JAVA环境大小约65K,这个需要预先安装java程序

 

 

CSDN:

http://blog.csdn.net/zhanglq2014 关注作者更新。

 

       上述是一些简单基本用法,如有兴趣继续了解更多信息,请参阅专利号:2014101956879,那里有较多具体详细介绍。有任何的问题和建议,欢迎和我联系,我的email:zhanglvquan@163.com  QQ: 99296575.

 

原创粉丝点击