从CSDN密码泄露谈网站存储密码的几种方式

最近国内著名IT站点CSDN被******,并将其存储的600万个用户的明文密码公布到了网上。此事件中暴露了CSDN网站设计之初在存储密码的方式为明文,并最终为***所利用。

动态网站出现的历史并不长,总计只有不到20年的历史,这期间经历了从CGI开始的快速发展。而对数据库的应用也最终涉及到了密码的存储。早期的网站正是如CSDN这样将密码以明文方式存储在一个数据库字段中。该方法虽然很简便,但却存在诸多安全隐患。此次CSDN被***就是***下载了其数据库备份文件所致。

明文存储密码有如下危险:

1. 网站管理员可以看到所有用户的密码
2. ******数据库服务器后也能得到所有用户的密码
3. 用户如果以一些符号作为密码,则可能导致SQL注入***
4. 对密码长度有限制

现代网站已经基本不再使用明文密码存储的方式了,而是改用只在数据库中存储签名算法计算出的签名(digest)。常见的签名算法有MD5和SHA1。可以从任何一段字符串计算出一段固定长度的签名字符串。这样当用户输入密码时,直接将该密码代入签名算法得出固定长度的签名,再与存储的签名对比,相同则允许登录。用户注册时也是直接存储密码的签名,而不是明文密码。

使用存储密码签名的方式,就可以避免如上的四条危险了。但是危险的网络世界并不仅有这些危险,经过一些改进还可以防范更多的***方式。

虽然使用签名方式已经不再限制密码长度了,但是如果用户密码过短,仍然可以通过穷举密码的方式。将每个生成的密码代入签名算法,并对比签名。此时对应着***已经成功***数据库,但是面对一系列无意义的签名,而无法得知用户的明文密码。但是通过网上已有的一些网站,可以直接输入签名得到已经大量计算的得来的弱密码对应的签名。

为了应对此种***,可以在用户提交的明文密码中加上个前缀或后缀,使得实际计入签名算法的字符串变长。一般总长度超过12字节的明文就很难查询到对应的密码。所以只要确保加上的前缀或后缀比12字节长即可有效的提高安全性。

经过如上改造,就已经获得了业界较好的安全性了。***即使***了数据库服务器也无法推断出用户的明文密码。但是万能的***还可以祭出一招来获得特定用户的登录权限,即网络监听。如果签名算法是在服务器上执行的,那么从客户端提交的密码还是明文的,此时如果***使用网络监听,就可以得到用户的明文密码。而如果网站的设计更负责的在客户端(浏览器)就执行了签名算法,提交密码签名而不是明文密码,则安全更进了一步。此时***还有一招。

因为用户的密码是固定的,所以每次计算出的签名也是相同的,所以只要通过监听的方式截获一次某用户登录时提交给服务器的密码签名,并重新提交这个签名,就可以得到这个用户的登录后权限。这种***方式就是在网络监听基础上的重放***。

要避免重放***,就要想办法让每次用户提交的签名是不同的。所以在每次用户想要登录时,由服务器再生成一段随机的前缀或后缀字符串,作为登录令牌。客户端(浏览器)在生成签名后,再加上登录令牌,再计算一次签名,并提交给服务器。而登录令牌是用过一次即作废。这样即使登录过程的签名被截取,也无法再次使用其来登录了。

通过这样的设计,可以获得较高的安全性,避免了常见的******方式。同时用户也无需担心网站管理员看到用户的密码。

而果壳网正是使用如上的登录过程设计。

http://www.guokr.com/blog/81458/


这篇文章说的很仔细,我这种小白都能看明白。