编者按:本文作者为北师大的大三学生张俏,女Geek,在CSDN等各大网站的用户数据被泄露之后,她就MD5加密问题写下此文,发表了自己的看法,如果有读者想要跟作者进一步探讨,可以在新浪微博@阿豆拉。
MD5为现在应用最广泛的Hash算法之一,在1992年由MIT 的Ronald L. Riverst提出,由MD4演化而来。该算法广泛应用于互联网网站的用户数据加密,能够将用户密码加密为128位的长整数。数据库并不明文存储用户密码,而是在用户登录时将输入密码字符串进行MD5加密,与数据库中所存储的MD5值匹配,从而降低密码数据库被盗取后用户损失的风险。
但由于Hash碰撞的存在,MD5加密的数据并不安全,可以由生成相同Hash值的字符串破解,所以提出了加入随机数salt的MD5加密方法,一定程度上增大了字典攻击的难度。
问题提出
前一阵在新浪微博上,有一个人发布了这样一条微博:“出道互联网安全常识数学题……假设你的网站所有用户密码都是md5加密(单向散列,非可逆)的,假设你网站有10万会员,如果你的用户库丢了,会有多少会员密码被破解?想想看。”当时我的一位朋友认为10万个密码全部都会被破解,我却不这样认为,因为根据我的先验知识:
(1) MD5加密算法在互联网应用中广泛被使用,MD5不是简单的古典加密算法,不能通过逆向Decrypt解密,只能通过Hash碰撞破解(Hack);
(2) 我曾经看过对同一个字符串进行MD5加密的结果,产生结果是随机的字符串(后来经过查找资料发现我所看到的不是简单的MD5加密,而是加盐后的结果);
(3) MD5用作密码加密算法并不是绝对安全的,因为可能产生Hash碰撞,简单密码的MD5加密可以通过彩虹表查找到;
(4) 我曾见过几个破解MD5加密的网站(http://www.cmd5.com/),大多数的做法是先免费为用户暴力破解,积累起足够的数据库可以破解简单密码后,解密服务便开始收费,所以MD5密码的破解不应该那么简单。
在经过对这个问题激烈的讨论过后,没过多久便发生了CSDN的数据库泄露事件,600万条数据库记录被任意传播。紧接着天涯论坛的数据库也泄露了,2000万条数据库记录被证实几乎均可以登录。而这两个网站的数据库中所保存的用户密码都没有经过加密,即为明文存储的。这种事情的发生更加证实了对网站数据库中所保存的用户密码进行加密的重要性。
现今流行的对用户密码加密算法中,MD5加密是最为广泛使用的算法之一。
背景知识
对于散列函数h(x),必须满足下列特性[1]:
- 压缩:对于给定输入x,输出长度y=h(x)很小;
- 效率:对于给定输入x,计算y=h(x)很容易;
- 单向:该散列函数H是一个单向函数,即对于几乎所有的x,已知H(x)的值y求x是不可行的;
- 弱无碰撞:已知x,求出x’使得H(x’)==H(x)在计算上是不可行的;
- 强无碰撞:对于任意x≠x’,H(x’)==H(x)在计算上是不可行的。