发明内容
本发明所要解决的技术问题,就是提供一种基于高碰撞概率散列函数的登录预先验证方法,可大大节省系统运算资源。
解决上述技术问题,本发明采用的技术方案如下:
一种基于高碰撞概率散列函数预先验证的计算机系统登录方法,包括以下步骤:
S1 用户登录输入密码X;
S2 密码经过设定的高碰撞概率散列函数H(X)运算获得一数值M1;
S3 将M1与本地存储的预先校验信息M进行比较,如果相同则发送用户名和密码到服务器验证;
S4 如果M1与本地存储的预先校验信息M不同则弹出对话框提醒用户密码有误;
S5 用户点击对话框选项确定是再次输入密码还是直接发送给服务器验证;
S6 如果用户选择再次输入密码则重复前面S1-S4的步骤;
S7 如果用户选择不再次输入密码,则发送用户名和密码到服务器验证;
S8 用户名和密码通过验证后,将该密码经过设定的高碰撞概率散列函数H(X)运算获得数值M1存储到本地作为预先校验信息M。
所述的步骤S2高碰撞概率散列函数H(X)运算包括以下步骤:
S2-1)X:为输入密码的16进制数值;
S2-2)计算 Z=f(X) , 其中f(X)为X的多次幂或指数运行函数;
S2-3)计算 d , d为从0到X中最大的素数;
S2-4)计算 Y=X*d ,其中d为小于X的最大素数;
S2-5)计算 M =Z mod(Y) , Y为选取的大于X小于Z的除数。
本发明通过采用将用户密码信息经过一定的算法存储在本地,当用户登录时预先校验输入的密码经过同样的算法是否能得到和本地存储内容一致来进行预先验证,一致则发送到系统进行验证,如果不一致则弹出提醒对话框询问和以往密码不一致,让用户确认是否要发送到系统进行验证,如果用户没有在别处修改密码,则必然是用户输入错误,合法用户则会自觉再次输入密码而不发到系统进行验证,从而减少错误输入直接发到系统进行验证。
本发明的原理:
登录预先验证的方法要充分考虑其安全性,防范攻击者对利用本地存储的密码加密后的内容进行破解。目前对密码验证的方法主要采用单向散列函数来计算用户设定密码得到一散列值存放到验证数据库中,当用户登录输入密码后系统将收到的用户密码通过同样的散列函数计算获得一个结果与系统验证数据库中存储的对应用户密码散列值相比较来进行验证。
散列(HASH)函数H也称哈希函数或杂凑函数等,其输入为一可变长x(可以足够的长),输出一固定长的串h(一般为128位、160位,比输短),该串h被称为输入x的Hash值(或称消息摘要Message Digest、指纹、密码校验和或消息完整性校验),计作h=H(x)。为防止传输和存储的消息被有意或无意地篡改,采用散列函数对消息进行运算生成消息摘要,附在消息之后发出或与信息一起存储,它在报文防伪中具有重要应用。
消息摘要采用一种单向散列算法将一个消息进行换算。在消息摘要算法中,文件数据作为单向散列运算的输入,这个输入通过HASH函数产生一个散列值。如果改动了文件,散列值就会相应地改变,接收者即能检测到这种改动过的痕迹。从理论上来讲,攻击者不可能制造一个替用的消息来产生一个完全相同的消息摘要。Hash函数可用于数字签名、消息的完整性检测、消息的起源验证检测等。
Hash函数H一般满足以下几个基本要求:
(1)输入x可以为任意长度;输出数据串长度固定;
(2)正向计算容易,即给定任何x,容易算出H(x);反向计算困难,即给出一Hash值h,很难找出一特定输入x,使h=H(x);
(3)抗碰撞性(抗冲突性),包括两个含义,一是给出一消息x,找出一消息y使H(x)=H(y)是计算上不可行的(弱抗冲突),二是找出任意两条消息x、y,使H(x)=H(y)也是计算上不可行的(强抗冲突)。
对Hash函数有两种穷举攻击。一是给定消息的Hash函数H(x),破译者逐个生成其他文件y,以使H(x)=H(y)。二是攻击者寻找两个随机的消息:x,y,并使H(x)=H(y)。这就是所谓的冲突攻击。穷举攻击方法没有利用Hash函数的结构和任何代数弱性质,它只依赖于Hash值的长度。攻击者要对产生同样的Hash值,为了确保100%的成功率,其必然需要穷举全部的样本空间,这样是非常巨大的计算量,然而攻击者如果只为了获得50%的成功率是不是其穷举空间也至少减少一半?然而理论计算的答案确实否定的。
例如以生日攻击(Birthday Attack)为例:在一个教室中最少应有多少学生才使得找一个学生与某人生日(该人也在教室)相同的概率不小于1/2?答案是254人。但至少有两个学生的生日在同一天的概率不小于1/2的答案出人意料地低,仅为23人。
一个人与一个已知生日的人不是同生日的概率是364/365,假如教室有t个人,则其余的人与某人都不同生日的概率是(364/365)t-1,所以至少有一个人与此人同生日的概率是1-(364/365)t-1。
第一个人的生日为一个特定生日,第二个人不在该日生的概率是(1-1/365),第三个人与前两位不同生日的概率是(1-2/365),第t个人与前t-1个人不同生日的概率是(1-(t-1)/365),所以t个人都不同生日的概率是(1-1/365)(1-2/365)……(1-(t-1)/365),利用1-x>>e
-x (当x很小),概率约为
,而至少有两个人生日相同的概率是1-(1-1/365) (1-2/365)……(1-(t-1)/365)。经过计算,t>>
>>22.3,即随机选择23人,至少有2人生日相同的概率至少为1/2。
生日攻击意味着攻击者为获得50%的攻击成功率,代价并不是100%成功率的一半,而只需原样本空间的开方,例如32位的消息摘要,在
个随机HASH值中至少有1/2的概率发生一个碰撞,这使得HASH值的长度有一个下界。
通过在本地存储密码相关信息便能实现预先验证,然而如果简单加密用户密码则会带来安全隐患,因而在本地加密用户密码的算法需要妥善设计。
采用单向散列函数对用户密码进行加密是防止破解的最常用方法。目前多大数系统在验证服务器端存放的都是用户密码的MD5值。MD5算法是一种碰撞概率极低的算法,例如32位的MD5,要
次攻击才会产生一次概率50%的碰撞,所以两个密码只要MD5值相同基本这两个密码就是完全一样的。然而在本地存储密码加密结果则不能采用这种碰撞概率极低的算法,因为攻击者一旦通过暴力穷举产生一次碰撞则就破解了密码,给密码安全带来隐患。例如早期的QQ登录就采用了MD5加密用户密码然后BASE64编码存储在本地,该方法被解析公开后,对应结合字典进行的暴力破解可很快破解出密码,最后腾讯公司放弃了本地预先验证的方法,要求全部提交到服务器进行验证。采用强度更高的2重、3重MD5加密理论上来说加大了破解难道,但实际的穷举空间也就用户习惯会能输入的不超过20位的密码,一层128位MD5的碰撞空间已经完全覆盖了用户输入范围,多重MD5加密加大了计算量,对穷举空间范围不会产生影响,依然会被破解。
而采用提取密码的某几个字位等信息来加密虽然是单向无法破解密码,但还是会暴露密码的部分信息。
采用奇偶校验或CRC校验值作为密码验证信息,这种方法可以非常好的防止破解,例如用奇偶校验,任何密码最后保存的信息只是奇偶校验位则要么是0,要么是1,任何人都不可能从这个奇偶校验位来破解出密码,但这种方法碰撞率太高,用户自身输入偶然错误也不能很好验证。
为防止利用本地存储的密码加密内容进行破解,本发明提出高碰撞概率散列函数H(X)来加密密码,从而确保了加密内容不能破解出密码。将用户输入的密码(通常要求密码长度大于6)看作一个输入的16进制整数X(X大于166),将X经过多次幂运算或指数运行得到结果Z,Z作为被除数,选取除数Y,其中Y大于X小于Z,将Z除以Y的结果及取余运算结果作为预先校验信息M。
X:为输入密码的16进制数值。
Z=f(X) , 其中f(X)为X的多次幂或指数运算函数。
d: d为从0到X中最大的素数。
Y=X*d:为选取的一个大于X小于Z的除数,其中d为设定的小于X的素数。
M=Z mod(Y) ,M为Z对Y取模运算的结果,M及为要求的预先校验信息。
则高碰撞概率散列函数H(X)= f(X)mod(Y)。
该算法要确保两点:
(1)算法单向运算,且采用密码X迭代运算生成的预先校验信息M具有很高的碰撞概率,及多个不同密码生成的预先校验信息是相同的,从而防止采用逆算法破解。 (2)算法产生的预先校验信息的枚举范围大于密码X的取值范围,从而防止字典匹配破解攻击。
安全性分析:为使分析更为简洁,假设用户输入密码M为纯数字0-9,密码长度为3。(实际输入范围更大安全性比纯数字安全性更高)若攻击者采用暴露直接穷举密码需要穷举的范围为000-999,一共103个。如果简单的选取10作为除数,将输入数值除以10取余数保存作为预先校验信息M。攻击者利用该余数则穷举密码需要穷举的范围为000-999中除以10余数为M的数,一共103 /10,为100个,比不保存任何预先校验信息穷举的范围还小,从而使得密码安全性降低。采用本专利方法将输入范围进行扩大,例如将X的二次幂X*X作为被除数Z再除以除数Y,假设Y=10,则同余数的个数为106/10=105,比不保存任何预先校验信息穷举的范围扩大了,但是由于Y=10太小,攻击者会生成余数是0-9的十个不同余数字典,来筛选匹配实施字典匹配破解攻击,因此除数Y不能太小,选取Y>X,从而使得余数范围大于X取值范围,为确保被除数Z大于余数Y,则Z最好选取X的三次幂以上的迭代运行来生成。与幂运算类似还可以用e的X次方来作为被除数。
有益效果:
(1)提出的登录预先验证方法通过碰撞率非常高的单向散列函数来保存加密密码,在本地存储的密码加密后的内容无法破解出密码,确保了密码验证的安全性。
(2)提出的登录预先验证方法通过预先验证减轻了错误输入和破解对系统验证带来的负担。
本发明利用单向散列函数加密用户登录密码存储在客户端,在本地实现用户登录时预先进行密码验证,从而减轻系统应对错误输入和暴力破解带来的验证运算负担,同时为提高安全性,在客户端本地采用的单向散列函数碰触概率非常高,这样即使遭到本地破解攻击,破解出的结果也与密码毫无关系。本发明既通过预先验证减轻了系统验证负担,又确保本地存储的密码校验信息无法破解出密码,该方法实用、安全可靠。
具体实施方式
如图1的总体流程图所示,本发明所提出的一种基于高碰撞概率散列函数预先验证的计算机系统登录方法,包括以下步骤:
S1 用户登录输入密码X;
S2 密码经过设定的高碰撞概率散列函数H(X)运算获得一数值M1;
S3 将M1与本地存储的预先校验信息M进行比较,如果相同则发送用户名和密码到服务器验证;
S4 如果M1与本地存储的预先校验信息M不同则弹出对话框提醒用户密码有误;
S5 用户点击对话框选项确定是再次输入密码还是直接发送给服务器验证;
S6 如果用户选择再次输入密码则重复前面S1-S4的步骤;
S7 如果用户选择不再次输入密码,则发送用户名和密码到服务器验证;
S8 用户名和密码通过验证后,将该密码经过设定的高碰撞概率散列函数H(X)运算获得数值M1存储到本地作为预先校验信息M。
其中高碰撞概率散列函数H(X)运算流程如图2所示,包括以下步骤:
S2-1)X:为输入密码的16进制数值;
S2-2)计算 Z=f(X) , 其中f(X)为X的多次幂或指数运行函数;
S2-3)计算 d , d为从0到X中最大的素数;
S2-4)计算 Y=X*d ,其中d为小于X的最大素数;
S2-5)计算 M =Z mod(Y) , Y为选取的大于X小于Z的除数。