说说密码那点事儿

其实csdn的库早就被拖过了。只是到现在才爆出来。
今天有一个,唔,说是图虫网的攻城湿,在微博上爆了这么一贴

#CSDN密码事件#中的核心问题在于CSDN竟然在数据库里保存了用户的明文密码。这是严重缺乏职业道德的行为,CSDN这种做法的居心叵测。图虫从第一天起,就从来没有保存过用户的明文密码,而是保存md5加密之后的密码。md5加密是不可逆的,也就是说即使图虫的数据库被攻破 ,黑客也无法获得任何用户的密码

然后,还附了张图。

看着好像是非常安全的一事儿吧?其实我们对安全了解得还太少。

比如我拿着数据库中第一行的值,到cmd5.com这网站上一反查,就得到了它加密前的字串:“20010901”。cmd5有近80T的数据。

微博评论中,说要加盐。盐是怎么一回事呢?好吧,以我肤浅的编程经验说说这历史。
我们要验证用户是否可登录,一般会拿到username和password,然后拿到数据库中比对。
最早的逻辑一般是这样的:
$user = User::findByUserName($username);
if(!$user){
echo “找不到用户”;
}
if($user[‘password’] == $password) {
echo “密码正确”;
} else {
echo “密码错误”;
}

首页通过用户名找用户对应的那行数据。找不到就说明这个用户没注册。找到了就比对密码。最土的方法就是我在注册的时候,把用户的密码写到数据库里,这样一比对就实现功能了嘛!
是的,CSDN的早期的攻城湿也是这么想的。但服务器或程序没写好,数据库被人抓到了。于是黑客就拿到了数据库中user表的username和password这两个字段。 于是,咳,黑客拿着用户名和密码到各网站去试,因为很多人习惯在各地使用相同的用户名和密码,于是就……

后来捏,就有了md5加密这回事。
在数据库中存放的是md5($password),然后比较的时候,把用户输入的密码也md5一下,再和数据库中的值做比较,要是对应上了就放用户进来。
这有个好处就是密码不是明文的了,当年的黑客要同样抓到username和password,但看到的是一个加密过的密码,解不出来,十有八九就放弃了。

但技术的更新是飞快的。。于是就有了cmd5这种站。原理么,就是收集尽可能多的字串,然后把它的md5值记下来。然后反查。
现在普通的md5值也是会被解密出来的。所以现在md5也变得不靠谱了。
所以就有了盐(salt)。盐是一个字串。
数据库中密码存放的是md5(md5(password)+md5(salt)) ,比如密码是123456,salt是ilovethisgame,那么数据库中的字段存放的就是md5(md5(123456)+md5(ilovethisgame))。
这也是现在大部分程序使用的方法。但还有破点儿的程序使用的是这种加密:md5(password+salt),或是md5(md5(password)+salt),这有用么?笨蛋。

好了,现在应该蛮难搞出123456了吧。 其实还不会。如果有了社工库的帮助。猜出一个用户在salt下的密码还不算很难。因为你的salt可能还是很简单,比如就是123456,或是网站名,或是常用字串。
所以就有了随机盐,也就是每个用户有自己的salt。
用户A的salt是123456, B用户的可能是kisstherain,之类。然后把盐也保存到数据库里。这样去比对。

唉,不幸的是,我们的数据库还是被人抓走了,现在username, password, salt都在他们手里了,解出密码不是分分钟的事儿?
好吧,那我们就用md5(md5(password)+md5(SECRET)+md5(personal_salt))来保存密码吧。其中SECRET应该是写在程序里的一个字串。这样黑客们猜出所有密码的代价就非常非常大了。

除非你的用户真的非常非常有价值。
除非你的代码和数据库都被人抓到了。
你的用户的密码应该还是比较安全的。

Copyright © 2011. All Rights Reserved.

《说说密码那点事儿》有1个想法

  1. 哈哈,看到“或是md5(md5(password)+salt),这有用么?笨蛋”就不自觉地笑了啊,赤果果地打康盛的脸啊

发表评论

电子邮件地址不会被公开。 必填项已用*标注