如何结合工具在服务器端保护用户的密码信息呢?近年来密码泄漏的事件屡出不穷,仅见诸报道的就包括了索尼、花旗银行这样的大型国际企业。表1摘自安天实验室的一份报告,列出了近年来的密码事件受害者。
表1 密码时间受害者(单位:个)
从中可以看出,数据库失窃已成为网站的常态。这些公布出的数据还只是冰山一角。但数据库失窃并不意味着用户和密码信息的立刻泄漏,从加密学的理论上说,实用的加密算法并不一定是不可破解的算法,而是让破解者需要的资源(计算能力与时间超过了破解者能忍受的限度,从而使破解者放弃破解的努力。安天实验室开发的开源工具Anity Password Mixer(后文简称APM),这款小软件也是从同样的目标出发,让攻击者在破解使用APM的网站用户数据库时需要花费更多的资源,从而延缓攻击者的破解时间,或是迫使其转向更简单的网站。
APM的原理并不复杂,总共八个字“一人一密、一站一密”。这里的密是指密码存放的方式,简而言之,就是同样的密码在不同的站点,或者是在同一个站点的不同用户都会以不同的方式存放。
在分析APM的效果前,我们先看看现在的攻击者们都能做些什么。首先他们通过僵尸网络都拥有大量的计算资源,可以进行密码的暴力破解工作。其次他们拥有一种或几种类型的彩虹表,彩虹表(Rainbow Tables)是一种庞大的、针对各种可能的字母组合,预先计算好的哈希值的集合,通过直接对比哈希值就可以获得该哈希值对应的原始明文密码。由于彩虹表需要尽可能地覆盖所有的字母组合,一个彩虹表可能需要有100G,甚至更大存储空间,但对现在的大型硬盘来说,彩虹表占用的空间已经不再是问题,而其带来的线性破解性能是极其夸张的。最后攻击者至少拥有一份高频密码表,可能对应每个网站中10%~20%的用户密码。同时他们还可能拥有一份已知密码表,这个表覆盖了他们已破解的数据库中的上千万个密码。
在了解攻击者的能力后,我们可以看看不同类型的网站在用户数据库泄漏以后会发生什么事情。首先是那些在国情需要下使用明文密码的网站,就相当于双手把用户名和明文密码向攻击者献上。其次是采用各种标准Hash算法存放密码Hash值的网站,在彩虹表的面前也和明文密码的程度相当。目前的彩虹表已成为公开的资源,有商业用途的,如ophcrack;也有免费开源的,如Free Rainbow Tables;也可以提供给个人软件定制生成的,如RainbowCrack。可见,对密码进行各种标准Hash计算的方法在彩虹表的面前也毫无防御能力。
因此大多数网站在进行密码加密处理时需要进行进一步的处理,比如采用未公开的算法,或者是进行加盐处理。但是寄希望于自定义算法的安全性也是无效的,一个好的算法应该在公开的情况下也能尽可能地保证数据的安全。而且网站被攻击丢失的可能不仅仅是数据库,还包括整套网站的代码,这样自定义算法对攻击者也是毫无效果的。即使攻击者没有办法掌握算法内容,通过统计方法对一般的加密算法进行破解也并非难事。加盐是指对密码进行Hash前,先把密码和一个变量进行运算,并将运算后的结果进行hash,这样加的盐不同,同样的密码进行Hash计算的结果也不一样。应该说加盐是防止彩虹表的比较简单而有效的方法,但如果使用加盐的方法过于简单,例如所有用户使用同样的“盐”变量,则加密效果和使用自定义算法的效果类似。
APM在算法上并未采用特殊的算法,而是采用了标准的SHA256,在实现上也借助了大量的开源代码,如使用Kyoto Cabine进行数据库管理,使用m2crypto进行哈希和密钥加密处理。关键的部分在于在保存用户和密码信息时,为每个用户生成不同的“盐”变量。这样即使攻击者获取了使用APM库的账户信息,也无法直接采用通用的彩虹表或编程技术来解密所有的库,而是必须为每个用户单独进行破解。同理,由于每个用户在每个站点的盐都不相同,不同站点之间的密码库也无法相互进行对照破解。APM目前提供了Python、PHP和Ruby三种不同常见动态网页编程语言的接口,对APM感兴趣的读者可以在http://codegoogle.com/p/password-mixer/站点上获取到APM的源码,以及更详细的文档。最后感谢安天的李肇星博士为本文提供的各类素材。
(作者单位为东南大学计算机学院)
特别声明:本站注明稿件来源为其他媒体的文/图等稿件均为转载稿,本站转载出于非商业性的教育和科研之目的,并不意味着赞同其观点或证实其内容的真实性。如转载稿涉及版权等问题,请作者在两周内速来电或来函联系。