Honeywords:MakingPassword-CrackingDetectable作者:AriJuels,RSA实验室;RonaldL.Rivest,MITCSAIL。摘要:我们提出一个提高散列密码的简单方法:为每一个账号关联额外的“honeywords”(伪密码)。一个盗取了散列密码文件并反转了散列函数的攻击者不能区分密码和honeyword。试图使用honeyword登录会触发一个警报。一个辅助的服务器(honeychecker)可以在登录环节识别密码和honeyword,并且当honeyword试图登录时它可以发出警报。关键字:密码、密码散列、密码破解、honeywords、伪密码、登录、认证1.介绍众所周知,密码是一种较弱的认证机制。用户通常会选择较为简单的密码。一个盗取了密码散列文件的攻击者往往可以通过暴力破解的方式获取到用户的密码p,它的散列值H(p)等于密码散列文件中存放的值,从而攻击者就可以冒充用户登录。Mandiant最近的一个报道阐述了在当前的环境威胁下散列密码破解的重要意义。密码破解是仪器化的,例如,在最近的一个反对纽约时报的网络间谍活动中。在过去的时间里可以看到很多备受关注的用户密码文件的泄露事件。Evernote的5000万用户密码暴露,同时这些用户还是Yahoo,LinkedIn,以及eHarmony等的用户。一种解决当前状况的方法是使密码散列变得更加复杂和耗时。这其实就是“PasswordHashingCompetition”背后所代表的方法。这个方法是有效的,但是同时它也减慢了合法用户的认证进程,并且我们也不能容易的检测到密码破解。有时系统管理员会设置一些虚假账号(叫做honeypotaccounts),一个盗取了用户密码散列文件的攻击者使用这些账号进行登录时便会激发一个警报,系统便会检查到密码破解。由于这些账户并不是真正合法的用户,所以攻击者的试图登录便会被检测到。然而,攻击者可能会区分真实密码和诱捕密码,从而避免被检测到。我们推荐的方法是将诱捕数据扩充到每一个账号(包括合法的用户),通过让每个账户拥有多个可能的密码,但其中只有一个是真正的密码,其他的就被叫做honeywords。一个honeyword的试图登录就会被检测为敌对攻击,同时发出警报。这种方法并不特别深,但是却是非常有效的,因为它使得一个使用通过盗取密码散列文件并暴力破解而获取到的用户密码的每一次登录都面临着被检测到的风险。因此,honeyword提供了一种有效的层次防御。在其他文献中也出现过一些相似的理念。我们所知道的与本论文最相关的一项研究是Bojinov等人的Kamouflage系统。我们认为,honeyword最早是出现那项研究中。另外一个和我们的研究非常相近的是一个叫虚假密码文件的系统设计(honeyfiles),它们监视所有被认为是信号入侵的密码提交。最后,一项由Rao申请的专利描述了对系统每一个账户设计一些叫做“failwords”的诱捕密码,通过这些诱捕密码使得攻击者认为他已经登录成功,但实际上却被检测到了。我们会在本文第8节给出相关工作的概述。总之,我们的期望是通过这篇文章能够鼓励大家更多的使用honeyword。2.技术描述我们假定一个拥有n个用户u1,u2,…,un的电脑系统,这里的ui是指第i个用户的用户名。所谓的电脑系统(或者简称为系统)指的是用户提供了正确的用户名和密码之后就能够登录的系统;这就包含了多用户电脑系统,网站,智能手机,应用程序等等。我们用pi来表示用户ui的密码。这个指的是正确的、合法的用户密码;是用户用来登录系统的密码。在当前的实验中,系统使用了一个加密的散列函数H并且存储用户密码的散列值而不是原生的密码。也就是说,系统维护着一个由用户名/密码散列值键值对组成的文件F,也就是(ui,H(pi)),其中i取值1到n。在Unix系统中,这个F文件可能存放在/etc/passwd或者/etc/shadow目录中。因为系统存储密码的散列值而不是原生的密码,所以当攻击者获取到F文件后并不能直接获取到用户密码;他需要反转散列函数从而获得用户真正的密码。散列函数H的计算可以(应该)包含特定系统或者特定用户的一些参数(salts);这些细节在本文不做详细介绍。当一个用户尝试登录系统时,登录操作就会根据用户提供的密码散列后到F文件中去查找。2.1:攻击情景对于密码的攻击情景有很多,大致可以分为以下6项:A.密码散列文件被偷取:一个攻击者通过特定的方法偷取到了密码散列文件,并且通过在线暴力计算的方式获取到一些真实密码。通常攻击者会盗取多个系统上的密码散列文件或者在不同的时期盗取同一系统上的密码散列文件。B.容易猜到的密码:用户所选的密码的实质部分非常简单以至于攻击者通过使用常用的密码登录就能成功的冒充系统真实的用户。Schecter等人建议要求用户选择不常用的密码来解决这个威胁。C.可见的密码:当攻击者可以看到用户密码的登录(如肩窥)或者攻击者在一个监视器上可以看到密码时,用户的密码就会被盗。一个类似于RSA的安全码的实时密码生成器能够有效地防御这种威胁。D.多个系统或服务使用相同的密码:一个用户可能在多个系统中使用相同的密码,以至于这个密码在一个系统上被破解,它同样也在其他系统中被破解。E.从用户处偷取密码:攻击者可能通过终端设备,比如手机或者手提电脑,使用恶意软件或者钓鱼攻击来获取用户的密码。F.密码修改盗用:这种机制会允许用户通过改变密码来恢复其安全性,但在修改密码的过程中,攻击者可以获取到用户密码或者将密码改成自己知道的一个值。我们主要针对第一种攻击情景,也就是说攻击者已经获取到了用户名和密码散列文件的副本,并且他也成功获得salt或者其它用于计算散列值的参数值。在这种情境下,攻击者可以通过暴力破解的方式来找出可能的密码,具体是对每个测试密码进行散列求值直到获取到一个或者多个用户的密码为止。如果密码是系统的唯一验证机制,攻击者便能够在不被检测到的方式下正常的登录系统。在本文中,我们认为攻击者能够通过反转散列文件F得到大部分的密码。我们假定攻击者不能持续的盗用系统密码,不能直接观察或者计算到用户新建的密码和honeywords。(当然,当攻击者试图使用一个破解密码,也就是一个honeyword来首次登录系统时会有被检测到的风险;在那之后,系统检测使用破解密码尝试登录的能力就会下降,如果攻击者有能力修改登录或者密码修改环节以及其检测方式的话)。尽管我们的方法直接适用于第一种攻击情景,我们的一些方法(如take-a-tail方法)在密码强化方面也有有益效果,因此也可以帮助抵制其他几种的攻击。2.2:Honeychecker(honeyword检测器)我们假定这个系统需要包含一个辅助的叫做honeychecker的安全服务器来协助honeywords的使用。我们假定电脑系统较易受到密码散列文件F被盗取的攻击,并且需要假定攻击者同时能够偷取salts和散列参数。因此,可以认为电脑系统中没有一处地方能够安全的存储额外的安全信息来抵制攻击者。Honeychecker就是这样一个用来存储隐私信息的分离的硬电脑系统。我们假定用户在登录系统或者修改密码时电脑系统能够和honeychecker进行交互。我们同时假定这个交互是建立在一个专用线路上或者交互需要加密和验证。Honeychecker需要拥有多种方式来检测各种各样的异常情况。我们同时假定honeychecker在检测到非法操作时能够发送警报信息。这个警报信息可以发送给系统管理员或者电脑系统中的其他部分。根据不同的策略,当一个登录操作进行时honeychecker可以选择是否给予电脑系统回应。当它检测到登录操作存在一定的问题时,它能够向电脑系统发出信号以拒绝登录的继续。另一方面,它也可以只是发出一个叫做“无声的警报”的信号给管理员,并且让登录操作在电脑系统上继续执行。在后一种情况下,我们可能更多的叫它为“登录监控器”而不是honeychecker。我们的honeychecker为每个用户ci维护一个简单的数据值c(i);这个数值是从1到k的较小的整数,其中k是一个整形参数(如k=20)。Honeychecker仅仅只接收两种类型的命令:A.Set:i,j把c(i)设置为j。B.Check:i,j检查c(i)的值是否为j。可能会返回检查的结果给需要的系统,也可能在失败的时候发出警报。关键安全和设计原则。电脑系统和honeychecker共同组成了一个分布式安全的结构。一个分布式系统目的在于当攻击者侵犯了系统或软件时能够保护隐私。把电脑系统的资源分散存储——举个例子说,把电脑系统和honeychecker放在分离的管理员域名下或者把软件运行在不同的操作系统中——使它作为一个整个系统而变得更加难以被攻破。我们所设计的原则是honeychecker数据库本身是不会允许一个攻击者来冒充一个合法用户。实际上,honeychecker仅仅存储随机选择的整数(每个用户ui的索引c(i))。事实上,我们的一个设计原则是即使honeychecker数据库被盗取也只是相当于把安全水平降低到不使用honeyword和honeychecker之前的水平。这种情况下密码散列文件F的泄露意味着攻击者不会再被honeyword所欺骗;他只需要破解用户真实的密码即可,因为这种情况下他已经知道哪些是真实密码的散列值了。我们同时把honeychecker的接口设计的十分简单,以至于构建一个独立的honeychecker是可以实现的。Honeychecker可能并不需要与电脑系统进行交互。如果我们设置为发送“无声警报”给管理员或者促发类似于我们第2.4节所说的那种防御策略的话,它甚至不需要对用户验证的决定作出干预。另外,honeychecker可以被设置去管理仅仅一小部分的隐私状态。与每一个用户对应的索引值,比如,可以存放在一张表中,这张表是加密的或者需要honeychecker中存储的键值来验证。在第8节中我们会讨论其他用于密码保护的分布式策略也是可行的。分布式加密策略,比如,可以避免电脑系统密码或者密码散列文件的被破译。与这些模式不同的是,honeyword可以通过较小的系统变化以及小开销的计算与交互成功的植入现存的密码系统中。Honeychecker可以成为一种使用标准接口的产品。honeychecker可以服务许多的系统。2.3:方法——建立本节将以最简单的方式描述honeyword的工作机制。对每一个用户而言,我们用多个不同的词组成的列表Wi来表示honeyword(又叫潜在密码或者更加简洁的叫做sweetword),其中Wi=(wi,1,wi,2,...,wi,k)。这里的k是一个比较小的整数,比如这里我们推荐的20。虽然k的值可以根据不同的用户而有所不同,比如对某些系统管理员而言可设置k=200,但是为了简单起见,我们假定k是一个固定的系统参数。在特定的环境下,k=2或者k=1000都是可能的或者说是合理的。当然,这些sweetword中的一个值,比如wi,j等于用户ui的真正密码pi。我们用c(i)来表示用户真实密码在Wi中的索引值,所以wi,c(i)=pi。尽管我们把wi,j叫做“潜在密码”,但他们也可以是一些其他的词组;一个潜在的密码可以是一个“潜在的通行码”或者一个“sweetphrase”。正确的密码也被叫做“sugarword”。其他(k-1)个词就被叫做“honeyword”,“chaff”,“decoys”,或者直接是“错误密码”。因此,sweetwords的集合Wi包含一个sugarword(正确的密码)和(k-1)个honeyword(非密码)。我们同样也允许一个sweetword是一个“thoughnut”——一个非常强的密码散列以至于攻击者无法反转散列函数获得其真实的值。我们使用符号来表示一个thoughnut。一个honeyword或者密码本身,都可能是一个thoughnut。散列文件F的定义因此就变成了对每个用户而言包含一个扩展的条目,格式