摘要 本文在分析常见的口令机制及其安全性的基础上介绍了一种非对称环境下的口令认证机制以及公共口令的概念。结合网络应用的具体要求,设计出安全的口令身份认证协议,并提出可行的实现方案。
开放式网络上不断增长的重要应用对网络安全提出了迫切的需要,身份认证系统作为网络安全的第一道防线,其安全性对整个网络的安全具有十分重要的作用。实现身份认证的方式有多种,如基于IC卡方式的身份认证系统(即每台用户终端上安装一个IC卡读解器),但这种系统费用较大,难以实现。另外一种更常见的方式是运用用户名/口令机制,但就目前来看,这种机制由于没有足够的安全保护而容易受到窃听、重放、口令猜测等攻击。本文介绍了非对称的环境下使用口令来实现身份认证的机制[1],以防止上述各种攻击。非对称环境是指认证服务器能够存储一个强秘密信息(如公钥体制中的私钥),但用户只用一个弱的人为记忆的口令作为唯一的认证密钥。在一些应用中这种非对称的情况很自然地出现了,如远程用户认证,这时用户并不携带任何能够存储一个强秘密信息的计算设备(如便携式电脑或智能卡)。还有一些协议的应用如SSL和SET也会出现这种情况,其中客户端并不拥有认证服务器的公钥。因此,本文利用公共口令的概念,设计了基于激励-响应的加密口令身份认证协议。
最简单的口令机制是以明文的形式把口令从用户传送到服务器。为了验证口令,服务器中存储了一个文件,其中包含了口令的明文形式(附于用户名)或口令在单向函数下的映射。后者是Unix系统的经典方法,而且还用于ftp和telnet的远程认证。在远程认证的情况下,这种机制的缺陷很明显,因为口令会很容易地被窃听者从网络上读取下来。
更为安全的口令认证形式使用的是激励-响应机制。在这种情况下,口令从不以明文的形式传送,而是用来对每一次认证时认证服务器所选取的激励进行秘密的函数计算。这提供了认证的新鲜性,但也使口令容易受到口令猜测攻击。这种攻击是指:假设入侵者拥有一个相对较小的口令字典,其中包含了许多普通的口令。入侵者首先记录包含了激励和响应的认证会话,然后用一些可能的口令对激励进行计算,看能否得到同样的响应。如果能的话,就说明这是一个合法的用户口令。不幸的是,在现实生活中,很多口令都可以在这样的口令字典中找到,因此这种攻击是非常有效的。
激励-响应机制的一种变型称为一次性口令机制,在这种机制下,用户每次验证自己的身份时使用不同的口令。如果这些一次性口令是从一个用户记忆的口令推导而来的,那么这个用户记忆的口令仍然容易受到口令猜测的攻击。另外一种方法是把这些一次性口令全部写在纸上让用户保存,这样就可以防止上述攻击,且这样做有一个优势,即口令不会被重用。但是,对于用户来说,需要携带一大批的口令,保证这些口令的安全和保密,并且每次都要输入相对复杂的字符串,这是非常不方便的。另外,这种机制也容易受到几种攻击,如口令被偷走(从记录口令的纸片上复制),中间人攻击等。
双向认证不但要求用户向服务器证明自己的身份,而且要求服务器向用户证明自己的身份。这对于避免中间人攻击和服务器假冒攻击是很重要的。在完全不可信的网络如Internet上的远程认证中,双向认证是非常重要的。
运用这种机制,在协议运行完成时,用户和服务器就可以共享一个秘密的会话密钥,这个会话密钥可用来验证或加密当前会话中的后继信息。这防止了入侵者拦截会话以及数据伪造和数据暴露。
入侵者重复地从口令字典中选取口令并用它来假冒合法用户。如果假冒失败了,入侵者就把这个口令从口令字典中删除,再用其它的口令进行尝试。在实践中,防止这种在线攻击的标准方法是限制口令到期之前允许用户登录失败的次数,或降低允许用户登录的频率。
很多时候入侵者可能得到内部人员的帮助进行攻击。实际上,入侵者往往就是系统中的一个用户,因此我们应该考虑到这种可能性,即入侵者拥有自己的账户及相应的合法口令。我们应该确保在这种情况下,协议能够防止入侵者用合法的账户来攻击别人的账户。
入侵者可能会偶尔得到应该被参与协议的主体保持为秘密的敏感数据(如当服务器或用户被损害时)。在这种情况下,协议的目标就是使得密钥或文件的泄露对整个系统的影响最小化。特别是,在口令机制的环境中,我们需要考虑泄露的密钥对导出的会话密钥(反之亦然)的影响以及损害口令文件或服务器密钥所产生的影响。
设计安全口令机制的困难之处起因于口令空间通常较小,比随机的密钥更容易受到攻击。特别是离线口令猜测攻击之类的穷尽搜索攻击非常有效。而且,当使用口令作为加密密钥时,我们总是假设即使口令是从一个很小的口令集中选取,加密函数仍然是安全的。这些假设非同寻常,以至要想形式化地定义这些可以证明现有协议安全性的加密函数的需求是非常困难的。
本文使用另外一种机制来避免这些问题,即在激励-响应中,不是用口令作为加密密钥,而是用服务器的公钥来对响应进行加密(服务器上存储了公钥及其相应的私钥),以抵抗传统的激励-响应机制中的口令猜测攻击。
所有已公布的能够抵抗口令猜测攻击的口令认证协议使用的都是公钥技术,这一现象并不是偶然的的,文[1]中证明了只用简单的对称密码技术来设计安全的口令认证协议即使有可能,也是非常困难的。
3.2 公钥加密的安全性
在本文中我们用公钥加密来设计口令认证协议。尽管协议本身非常简单直观,但是证明它们的安全性却不是简单直接的。特别是,加密算法的基本安全概念对于确保这些协议的安全性是不够的,因此必须利用一个更强的安全概念。这里,我们先简要地讨论一下这些概念。
公钥加密的基本安全概念是指:从本质上说,在给定其密文的情况下,推导出任何有关经加密的明文的部分信息是不可能的。特别是,给定公钥pk、密文c和可能的明文x1、x2,确定c是不是x1或x2的加密结果是不可能的(暗指这样的安全公钥加密算法必须是随机的,这样就使得简单的加密x1、x2再将结果与c相比较是不起作用的)。尽管这一概念极大地确保了秘密性保护,但并不足以确保我们所设计的协议的安全性,因此需要更强的加密算法的安全概念,它可以抵抗选择密文攻击。根据这一概念的定义,即使我们能够得到选择密文的相应明文(而不是c本身对应的明文),确定c是不是x1或x2的加密结果也是不可能的。如果使用了满足这一安全属性的加密算法,我们所描述的协议就是真正安全的。
3.2 公共口令
在用认证服务器的公钥作为加密密钥来设计口令认证协议时,要求用户知道这个公钥的正确值。在某些情况下,通过可信第三方对服务器公钥进行验证或向用其它形式和用户进行可信的公钥分配,上述要求可能会得到满足。但是,如果用户需要从远程机器上实现认证,而该远程机却没有办法验证认证服务器公钥的正确性,那么这些协议的安全性就无法保证了。在这种情况下,我们建议向用户提供服务器公钥的摘要 。这个摘要 的长度一般为60-80个比特,不需要用户记忆(可以安全地记在纸上或卡上),甚至不需要用户输入,只要在显示出来时用户能够识别就可以了。我们称这个摘要 为公共口令(Public passwords),这一概念具有重大的实用价值。
4口令身份认证协议的设计与实现
对于保密单位的园区网来说,如果用口令来实现身份认证,那么所设计的协议不但需要能够实现正确的身份认证,而且需要在用户进行了非法操作时,管理员可以是查出是何人何时在何台机器上进行了非法操作。针对这一具体要求,我们采用上文中介绍的机制,设计了单向的基于激励-响应的加密口令身份认证协议。
4.1 协议设计
协议描述:
U®S: Tu, IPDress
S®U: Tu, n, PKs
U®S: U, n, Tu, IPDress, ENC PKs (f(spwd, U, S, n, Tu, IPDress))
其中,Tu是U发起认证要求时的时间;S是认证服务器名,n是由S选择的用于保证新鲜性的一次性随机数,PKs是S的公钥;U、spwd分别是用户的用户名和口令,IPDress是用户所在机器的IP地址。
协议的执行过程:
U发出消息1通知S对其进行身份认证,并记下当时的时间Tu。
S验证消息1并非重放的消息后,记下Tu与IPDress,然后生成一个一次性随机数n,连同公钥PKs和Tu一起生成消息2发送给U。
U收到消息2后,在终端机器上计算MD(PKs),检验ppwd?=MD(PKs)(MD是防冲突的散列函数,如SHA-1)。ppwd即为公用口令,由于ppwd是公钥PKs的散列值,因此容易记忆。具体实现时可以要求用户输入ppwd,或者将ppwd值显示出来由用户选择,以此验证PKs的正确性。然后再验证Tu是否与发起认证时的时间相同。通过验证后,U用函数f对(spwd, U, S, n, Tu, IPDress)进行处理,再用PKs加密,生成消息3发送给S。S收到消息3后,首先检查收到的n与自己在本次协议执行中生成的n是否相同,Tu、IPDress是否与在消息1中收到的Tu、IPDress相同。如果相同,就用PKs对应的私钥解密消息中的密文部分,然后根据以明文传送的用户名U,查询用户的口令文件,通过计算验证f(spwd, U, S, n, Tu, IPDress)的正确性。
4.2 协议实现
利用文[1]中的形式化方法可以证明:在保证函数f和加密算法ENC为安全的前提下,该协议是安全的。因此函数f的结构和加密算法ENC的选择就尤为重要。对于公钥加密算法ENC来说,Bellare和Rogaway在文中提出一种简单的数据编码(称为OAEP),它与RSA算法一起使用可以满足3.2节中的安全性要求。这里我们重点讨论函数f的结构(f必须是一对一的函数)。为了抵抗因认证服务器安全受到损害而产生的攻击,我们将函数f定义
p1 = H1 (spwd, U, S)
p2 = H2 (spwd, U, S)
p3 = H3 (p2, salt)
f (spwd, U, S, n, Tu, IPDress) á MACp1 (U, S, n, Tu, IPDress), p2, n ñ
服务器存储salt、p3和p1作为口令文件,这里H1,H2,H3是单向函数,MAC是消息验证码,salt是一个随机串。
该机制可以抵抗对口令文件或服务器私钥的损害(但不能抵抗两者同时发生)。如果口令文件被泄露但服务器私钥保持秘密,那么攻击者仍然需要进行口令猜测攻击以得到p2。另一方面,如果攻击者得到服务器的私钥但无法获得口令文件,那么他仍然无法实现用户认证,因为他必须计算MACp1 (n, U, S),即需要进行口令猜测攻击以得到p1。
5结束语
本文所提供的口令认证机制具有安全、可靠的特点,但协议的具体实现还有很多细节问题需要考虑,如单向函数和加密算法的计算速度问题,认证服务器上用户口令文件的管理问题等。另外,对于上述协议来说,稍作扩展便可实现双向认证,但其安全性的形式化分析还有待进一步研究。
参考文献
1 Shai Halevi, Hugo Krawczyk. Public-Key Cryptography and Password Protocols. ACM Transactions on Information and System Security, Vol. 2, No. 3, August 1999, Pages 230-268.
2 M.Bellare, A.Desal, D.Pointcheval, and P.Rogaway. Relations among notions of security for public-key encryption schemes. In Advances in Cryptology—CRYPTO ’98, H Krawczyk, Ed. Springer-Verlag, New York, 26–45.
3 D.Dolev, C.Dwork, and M.Naor. Non-malleable cryptography (extended abstract). In Proceedings of the 23rd Annual ACM Symposium on Authentication and Authenticated Key Exchanges (New Orleans, LA, May). ACM Press, New York, NY, 542–552.
4 C.Rackoff and D.Simon. Non-interactive zero-knowledge proof of knowledge and chosen ciphertext attack. In Advances in Cryptology—CRYPTO ’91. Springer-Verlag, New York, NY, 433–444.