APP下载

基于口令的安全用户认证模型

2010-01-20李云超

现代电子技术 2009年21期
关键词:钩子用户名口令

黄 伟 孟 博 李云超

摘 要:对基于口令的访问控制进行研究,应用DES,SHA-512和Diffe-Hellman密钥交换协议,提出一个基于口令的安全用户认证模型。此模型可以抵抗中间人攻击、重放攻击、字典攻击和拒绝服务攻击,同时还能提供完善向前保密。基于提出的安全用户认证模型应用HOOK技术,给出了一个基于C/S方式的原型实现。

关键词:访问控制;身份认证;弱口令;哈希函数;HOOK;DES;Diffe-Hellman密钥交换协议

中图分类号:TP309 文献标识码:A

文章编号:1004-373X(2009)21-079-04

Secure User Authentication Model Based on Password

HUANG Wei,MENG Bo,LI Yunchao

(College of Computer,South-Central University for Nationalities,Wuhan,430074,China)

Abstract:Access control based on the password is researched,a secure user authentication model with DES,SHA-512 and Diffe-Hellman key exchange protocol is proposed.This model not only prevents MiM attack,replay attack,guess password attack and denial of service attack,but also provides the perfect forward secrecy.A C/S-based prototype is developed with hook technology.

Keywords:access control;identity authentication;weak password;Hash function;HOOK;DES;Diffe-Hellman key exchange

随着网络在人们生活中的不断深入,网络安全越来越受到人们的关注。身份认证是网络安全中最令人关心的热点问题之一。通常,用户在使用网络服务前必须向认证服务器提供一个对应的身份标识以及相应的秘密信息用于身份认证,网络服务提供商根据认证结果决定是否提供所需的网络服务及用户权限。目前网络应用大致利用以下三种类型的秘密信息实现身份认证机制:用户拥有的,比如利用智能IC卡存放一个足够大的秘密随机数(128/256 b)进行身份认证;用户知道的,比如用户利用自选的口令进行身份认证;用户的特征,比如用户用自身的生物特征,例如指纹、声纹、视网膜、脸型等进行身份认证。在这三类机制中,由于成本最低、实施方便使得基于口令的认证方式应用最为广泛。

1 相关工作

目前主要应用两种口令管理方式来增强口令的安全性:一种是一次口令(OneTime Password,OTP)的方式[1,2];另外一种是基于Hash函数的口令管理方式。对于一次口令的方式中用户在每次认证的时候,所提交的认证信息都是不同的,使整个认证过程更加安全,从而能够较好地应用在Internet环境下。但这样的OTP认证系统每隔一段时间需要用户重新初始化系统,这使得服务器的额外开销比较大;另外,用户在认证时需要进行多次Hash运算,在应用上也不够方便。

目前的研究热点主要集中在基于Hash函数的口令管理方式上,此方式的特点是真正的口令是由Hash函数计算产生,如Gabber等提出的LPWA[3],Ross等提出的PwdHash[4],Halderman等提出的Password Multiplier[5]和Yee等提出的Passpet[6]方案。LPWA和PwdHash方案都是将用户主口令和站点域名的Hash值作为真正的账号口令。这两个方案解决了多个口令的维护问题,但由于Hash函数的运算速度很快,它们容易遭到暴力破解。Password Multiplier和Passpet方案首先用主口令和用户信息经过多次执行Hash运算得到中间变量v,并保存在本地主机上,然后使用主口令、v和Web站点域名多次执行Hash运算得到账号对应的口令,两次计算中都执行迭代Hash运算,增加了计算的时间复杂度,提高了暴力破解的难度。以上基于Hash函数的方案存在明显的安全漏洞,只要攻击者攻破主口令,就可以计算出用户的所有账号口令,并且用户不能修改单个账号的口令。

Gajek等[7]提出应用每个用户使用高熵的口令并且不同的帐号使用不同的口令的方法来增强口令的强度,但没有解决用户需要记忆多个口令的问题,并且实现方法复杂。Bruce Schneier提出的Password Safe方案[8],将用户所有的帐号和对应的口令存储在经Twofish加密算法加密的口令库中,用户只需要记忆访问口令库对应的主口令就能管理所有的口令,但将口令文件存储在本地磁盘上,非常容易被窃取和破坏,因此不但没有增强口令的强度和安全性,反而增加了口令的不安全因素。

本文在挑战/响应的基础上,结合Hash函数的口令管理技术和隧道技术提出了一个基于口令的安全用户认证模型。

2 提出的基于口令的安全用户认证模型

应用Diffe-Hellman密钥交换协议,DES和SHA-512提出了一个基于口令的安全用户认证模型,如图1所示。此模型既能够抵抗中间人攻击,重放攻击,字典攻击和拒绝服务攻击,同时还能提供完善向前保密。在此模型中客户端连接器和服务器端连接器使用彼此的公钥加密Diffe-Hellman交换参数以抵抗中间人攻击;抵抗重放攻击通过在客户端连接器和服务器端连接器使用挑战/响应方式进行会话密钥建立;引入口令处理器以增加口令的强度,同时在服务器端引入“挂起”机制以抵抗字典攻击;抵抗拒绝服务攻击通过应用Email Server用于接受服务器发送过了的激活码;为了提供完善向前保密,客户端连接器和服务器端连接器在创建隧道时随机选择秘密指数,隧道创建成功后就将秘密指数删除。

图1 基于口令的安全登陆模型

提出的模型主要包含:登陆模块,口令处理器模块,连接器模块,数据库模块,Email Server模块。

用户通过登陆模块输入“用户名”和“口令”,登陆模块将“用户名”和“口令”传给口令处理器模块处理,连接器模块将“用户名”和处理过的“口令”通过隧道方式传给数据库,数据库将处理后的结果返回给连接器,然后通过隧道将结果返回给登陆模块。各模块的功能如下:

登陆模块:与用户实现交互的界面,向其他模块提出请求,并显示其他模块的响应。

口令处理器模块:用户注册和修改口令时,主动检查用户的口令;用户登陆时,加密用户的口令。

由于一般的用户往往会选择短的、有意义的字母组合或日常生活中常用的号码作为口令以方便记忆,而这些类型的口令数是有限的,因此攻击者可以利用电脑将所有可能的口令存放在字典中,然后快速地遍历字典进行反复猜测与比对,并在很短的时间内就有可能猜出一个用户的口令。

主动的口令检查在用户注册和试图修改口令的时候就进行。这样就可以有效地消除脆弱的,易被破解的口令。主动的口令检查对时间和资源也没有太大的消耗,因为其检查的过程不是一个破解的过程,而是利用口令本身检查其脆弱性的过程[9]。

登陆时用户的口令被当作DES的密钥用以加密用户名和口令的Hash值,为了提高安全性这里建议Hash算法使用SHA-512。加密算法被重复25次,得出结果中包含了11个字符长的字符串和两个字符的“Salt”。在系统校验用户口令时,系统把经过加密后的口令与Password表中存储的加密字串进行比较,如果相同则证明用户输入的口令正确。

连接器模块:为模块之间的通信提供加密解密功能。在模块之间建立隧道,提供相互认证,分配会话密钥和PFS。g和p是公共的Diffe-Hellman参数,a是A选择的秘密指数,b是B选择的秘密指数。

(1) 连接器A向连接器B发送质询RA;

(2) 连接器B收到质询RA,计算gbmod p,并将计算结果和RA一起用A的公钥加密,B再对加密结果{RA,gbmod p}A进行签名操作,并将运算结果[{RA,gbmod p}A]B和质询RB一起发送给连接器A;

(3) 连接器A将收到结果进行解密,得到质询RB,质询RA和gbmod p ,A计算gamod p,并将计算结果和RB一起用B的公钥加密,A再对加密结果{RB,gamod p}B进行签名操作,并将运算结果[{RA,gbmod p}B]A发送给连接器B;

(4) 连接器B将收到结果进行解密,得到质询RB和gamod p;

(5) 连接器A和B各自计算gabmod p,得到共享的会话密钥K,隧道建立成功。

数据库模块:存储用户的相关信息。

数据库中包含Users,Password和Faillog表。这三个表解决了文献[10]中提到的如何既能防止字典攻击,又能防止拒绝服务攻击的问题。Users表通过访问Password表获得用户的口令;Password表只能被Users表访问,提高口令的安全性;Faillog表记录用户登陆失败的情况,设置一个阈值,与阈值比较,超过阈值将该用户挂起不允许该用户再次登陆,这样可以完全抵制字典攻击;并将一个生成的激活码发送给该用户的Email中,以便用户再次激活帐号,这样可以抵制拒绝服务攻击。三个表的关系如图2所示。

图2 表间的访问关系

下面给出这三个表的具体的结构。

Users表用来记录用户登陆时认证和授权的信息,其结构如下:

用户名连接Password用户标识组标识状态激活码

用户名:标识一个惟一用户,设为主码,这里用用户的邮箱地址作为用户名。

连接Password:用来连接Password表,存取用户的口令。

用户标识:标识用户的安全级别。只有当用户的安全级别高于文件的安全级别时才可以对文件有“读”访问权[10]。

组标识:标识用户所属的组。

状态:标识用户帐户的有效性。有两个状态:“有效”和“挂起”。它能完全杜绝字典攻击。

激活码:激活用户帐户,能防止拒绝服务攻击。

Password表用来记录用户的口令,只能由Users表来连接调用和读取,对其他任何操作透明。其结构如下:

用户名口令

用户名:同表1的“用户名”字段。

口令:这里实际存储的是加密后的口令。

Faillog表用来记录用户用户登陆时的一些相关信息,其结构如下:

用户名次数时间

用户名:同表1的“用户名”字段。

次数:统计用户登陆失败的次数。

时间:记录最近一次登陆失败时间。

在此安全模型中另外还包括例外处理模块,各例外处理模块的功能如下:

用户名不存在例外处理模块:向调用模块返回“用户名不存在”,并进行相应处理。

状态无效例外处理模块:向调用模块返回“状态无效”,要求用户输入激活码,并与Users表中该用户的“激活码”字段比较,相等时激活用户的帐号。

密码不正确例外处理模块:向调用模块返回“密码不正确”,并进行相应处理。

Email Server:用于接受数据库发送过来的激活码,可以防止拒绝服务攻击。

3 基于C/S方式的原型实现

本文提出的基于口令的安全用户认证模型的实现可以采用B/S方式,也可以采用C/S方式。在此给出一个基于C/S结构的原型实现,如图3所示,客户端包含登陆模块,口令处理模块和连接器模块;服务器端包含连接器模块和数据库。

图3 基于C/S方式的原型实现

3.1 用户注册

用户输入注册名,连接器A使用会话密钥K加密用户名并将结果发送给连接器B,B使用会话密钥K解密将结果发送给数据库,数据库检查用户名是否存在,并将检查结果返回;用户名通过检测,用户输入口令;口令处理器主动检查输入口令,不允许弱口令通过;口令通过检测,口令处理器对口令加密,连接器A使用会话密钥K对用户名和加密后的口令进行加密,并发送到连接器B;连接器B使用会话密钥K解密得到用户名和加密过的口令,将用户名和加密过的口令发送给数据库,数据库将用户的相关信息添入表中。

3.2 用户登陆

用户登陆时,过程如下:

(1) 用户在登陆模块中输入用户名和口令;

(2) 口令处理器加密口令;

(3) 用户名和加密过的口令通过隧道传给数据库;

(4) 数据库验证用户

① 在Users表中查找,如果用户名存在并且状态为“有效”,则进入下一步;如果用户名不存在,转向用户名不存在例外处理模块;如果用户名存在但是状态为“挂起”,则转向状态无效例外处理模块。

② 通过连接Password字段,连接Password表。在Password中查找用户名所对应的口令进比较如果相等进入第(5)步;否则进入下一步。

③ 在Faillog表查找用户名对应的记录。记录此次登陆失败的时间。将登陆失败次数加1,比较是否超过最大限制次数。如果超过进入下一步;否则,转向密码不正确例外处理模块。

④ 将Users表中用户的状态字段改为“挂起”。通过Faillog表中用户最近一次登陆失败时间生成一个激活码(用于激活用户帐号),存储到Users表中用户对应的“激活码”字段并发送到用户的邮箱中,转向状态无效例外处理模块。

(5) 验证通过,通过Users表对用户进行初始化。

在客户端使用HOOK(钩子)技术来加强登陆的安全性。

钩子函数实际上是一个处理消息的程序段,每当一个应用程序调用函数GetMessage或PeekMessage而恰有一个消息即将被处理时,系统调用钩子函数。也就是说,当特定的消息发出,在没有到达目的窗口前,钩子函数先捕获消息,亦即钩子函数先获得控制权。这时钩子函数既可以加工处理该消息,也可以不作处理而继续传递消息,还可以强制结束消息传递。系统为每种类型的钩子维护一个钩子链,最近安装的钩子放在链的开始,而最先安装的钩子放在最后,也就是后加入的钩子先获得控制权。

由于最后安装的钩子总是放在最前,也就是最先获得对消息的控制权。为此可以在客户端每次登陆时,安装键盘钩子,钩子截取用户输入的用户名和口令,发送给口令处理模块和连接器模块,登陆成功后卸载键盘钩子。由钩子函数来阻断键盘消息在钩子链中的传递,将消息直接发送给消息接受窗口。本模型创建钩子的核心代码如下:

创建一个键盘线程钩子WH_KEYBOARD,在登陆窗口中SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hInst,GetCurrentThreadId());

钩子处理函数KeyboardProc如下:

LRESULT CALLBACK _stdcall KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)

{

if((nCode<0)||nCode==HC_NOREMOVE)

return CallNextHookEx(hook,nCode,0,0);

else if(hWnd!=NULL)

SendMessage(hWnd,WM_KEYINFO,0,0);

return CallNextHookEx(hook,nCode,0,0);

}

登陆成功后UnhookWindowsHookEx(hook);

4 结 语

身份认证是网络安全中热点问题之一,本文对基于口令的安全用户认证模型进行研究,应用DES,SHA-512和Diffe-Hellman密钥交换协议提出一个能够有效抵抗中间人攻击,重放攻击,字典攻击和拒绝服务攻击,同时能提供完善向前保密的安全用户认证模型,并且进行了安全性分析。最后给出了一个基于C/S结构的原型实现。

参考文献

[1]Lamport L.Password Authentication with Insecure Communication[J].Communications of the ACM,1981,24(11): 770-772.

[2]Haller N.The S/KEY One-Time Password System.RFC1760.1995.

[3]Gabber E,Gibbons P B,Matias Y,Mayer A.How to Make Personalized Web Browsing Simple,Secure and Anonymous [J].Proceedings of Financial Cryptography′97,Anguilla:Springer-Verlag,1997:17-31.

[4]Ross B,Jackson C,Miyake N,et al.Stronger Password Authentication Using Browser Extensions[A].Proceedings of the 14th USENIX Security Symposium.2005:17-32.

[5]Halderman J A,Waters B,Fehen E W.A Convenient Method for Securely Managing Passwords[A].Proceedings of the 14th International Conference on World Wide Web.Chiba:ACM Press,2005:471-479.

[6]Yee K P,Sitaker K.Passpet:Convenient Password Management and Phishing Protection[A].Proceedings of the Second Symposium on Usable Privacy and Security.New York:ACM ,2006:32-43.

[7]Gajek S,Sadeghi A R,Stuble C,et al.Compartmented Security for Browsers-or How to thwat a phisher with trusted computing[A].Proceedings of the 2nd International Conference on Availability,Reliability and Security.Washington DC:IEEE Computer Society,2007:120-127.

[8]Schneier B.Password Safe[EB/OL].http://www.schneier.com/passsafe.html.

[9]董光宇,高安全等级操作系统及网络服务的标识鉴别机制[D].北京:中科院软件所,2002.

[10]Mark Stamp.Information Security:Principles and Practice[M].Wiley,2006.

猜你喜欢

钩子用户名口令
《护士进修杂志》投稿程序
《护士进修杂志》投稿程序
《护士进修杂志》投稿程序
高矮胖瘦
口 令
谁和谁好
机智的快递员
好玩的“反口令”游戏
幸福的一家
《脉望馆钞校本古今杂剧》穿关之“钩子困带”考