3.2.2 挑战-应答协议
如图3-2所示,B欲对A进行认证,首先B应该向A发出随机提问Rand作为挑战,接着A就挑战Rand计算认证参数AP=fk(Rand)作为应答,这里f是A、B事先约定的加密算法,k是双方的共享密钥。收到应答后,B将进行同样的计算,以AP和Rand是否一致来确定A的身份。
图3-2 挑战-应答认证协议
挑战-应答协议采用的方法之一是通行证算法。假设存在一个挑战-应答认证系统,其函数f是秘密的,则称f为通行证算法。挑战-应答协议采用的方法之二是一次性口令,一个口令一旦使用就失效了。挑战-应答协议采用的方法之三是硬件支持的挑战-应答程序,根据输入挑战,硬件设备计算出一个适当的应答。挑战-应答协议的目的是对抗重放攻击。在挑战-应答协议的每一步均有一个历史时间戳,保证了协议可以有效地抵抗重放攻击。
1.一次性口令
一次性口令即一个口令只对应一次使用有效,这是口令时效性的一种极端形式。在某些场合,挑战-应答机制使用一次性口令。考虑把应答作为口令,由于连续认证的挑战是不同的,应答也是不同的。因此,每个应答在被使用后就变为无效。一次性口令就是一种在被使用之后就变为无效的口令。使用一次性口令的机制也是一种挑战-应答机制。挑战就是认证尝试的次数,应答就是一次性口令。
传统的身份认证机制是建立在静态口令的识别基础之上的,这种以静态口令为基础的常规身份认证方式存在许多口令被窃取的隐患。
(1)网络数据流窃听
很多通过网络传递的认证信息是未经加密的明文(如FTP、Telnet等),容易被攻击者通过窃听网络数据分辨出认证数据,并提取用户名和口令。
(2)认证信息截取、重放
对于简单加密后进行传输的认证信息,攻击者会使用截取、重放方式推算出密码。
(3)字典攻击
以有意义的单词或者数字作为密码,攻击者会使用字典中的单词来尝试用户的密码。
(4)穷举尝试
这是一种特殊的字典攻击,它使用字符串的全集作为字典。如果用户的密码较短,很容易被穷举出来。
为了解决静态口令问题,在20世纪80年代初,Leslie Lamport首次提出了利用散列函数产生一次性口令的思想,即用户每次同服务器连接过程中使用的口令在网上传输时都是加密的密文,而且这些密文在每次连接时都是不同的,也就是说密文是一次有效的。当一个用户在服务器上首次注册时,系统给用户分配一个种子值(Seed)和一个迭代值(Iteration),这两个值构成了一个原始口令。同时,在服务器端保留只有用户自己知道的通行字。当用户每次向服务器发出连接请求时,服务器把用户的原始口令传给用户。用户接到原始口令以后,利用口令生成程序,采用散列算法(如MD3),结合通行字计算出本次连接实际使用的口令,然后再把口令传回服务器。服务器保留用户传来的口令,然后调用口令生成器,采用同一散列算法,利用用户存在服务器端的通行字和它刚刚传给用户的原始口令自行计算生成一个口令。服务器把这个口令与用户传来的口令进行比较,进而对用户进行身份确认。每一次身份成功认证后,原始口令中的迭代值自动减1。该机制由于每次登录时的口令是随机变化的,每个口令只能使用一次,彻底防止了前面提到的各种窃听、重放、假冒、猜测等攻击。
当两个人需要发送加密的信息时,如果他们各自有一份一次性填充的副本,那么各自可以使用这个口令,或者用其他的方法来决定使用哪一个口令。当然,对于这种系统来说,其好处是即使密钥被破解了或者被演绎出来了,也只能对当前的信息有用,下一个信息需要使用不同的密钥。
2.硬件支持的挑战-应答程序
使用硬件支持一次性口令相对简单,因为口令不需要打印在纸上或者输出到某些中间媒体。硬件支持的挑战-应答程序有两种形式:通用的计算机和专门的硬件。两者实现相同的功能。
第一种类型的硬件有一个非正式的名称token,它提供了一种对消息进行Hash和加密的机制。使用这种设备时,系统首先发送一个挑战。用户把这个挑战输入设备里,设备返回一个适当的应答。一些设备要求用户输入其个人身份证号码或者口令,并把这作为密钥,或者结合挑战一起用来产生应答。
第二种类型的硬件基于时间。每隔60秒,就显示一个不同的数字,这些数字的变化范围是0~10n-1。有一个类似的设备与计算机相连,它知道设备为每一个注册用户显示的数字是什么。为了认证,用户提交他的登录名。系统请求一个口令,接着用户输入硬件显示的数字,后面跟一个固定的口令。系统验证数字是系统在当时期望用户提交的数字,同时固定口令正确。
3.挑战-应答和字典式攻击
挑战-应答技术是否容易受到字典式攻击,取决于挑战和应答的本质。一般而言,如果字典式攻击者知道了挑战和应答,字典式攻击就如同攻击一个重用口令系统。实际上,许多挑战是由随机数据结合公开数据产生的,而且攻击者可以获得这些公开的数据,所以攻击者没必要知道r的值。
例3-3 假设一个用户使用挑战-应答系统来认证自己。系统产生一个随机的挑战r,用户用Ek r()来应答,即用密钥k来加密r。
对这种挑战-应答系统的字典式攻击情形为:如果攻击者知道了r和Ek r(),他就可以穷举k的值,直到对r的加密和Ek r()匹配。