分类:
2012-03-07 21:15:14
原文地址:网站密码加密原理(初级篇) 作者:cheungmine
网站密码加密原理(初级篇)
——致CSDN们
我本来不想写这么初级的文章,但是发生了CSDN这当子事情之后,我还得真得写点入门级的文章,给你们科普科普。
第一:什么是密码。通 俗地讲,密码就是进入一道门的钥匙。而之所以我们能找到我们要进入的门,靠的是门牌号。那么门牌号就是用户名。不知道我这么讲,你们能不能听明白。钥匙就 是带锯齿的小铁片,插到一个铁做的洞洞里,如果刚好吻合,旋转一下,就卡擦一声,打开了。简单吧。打开了门,就发生了人类说不完的故事。
但是人类发明了钥匙和锁以来,从来没有破解不了的锁。这也算是锁的悲哀。
通 常我们从商店里买来的锁带有3把钥匙,而锁厂是不能留下一个备份的。可是,现在的情形不是这样子,CSDN给我们每人一把钥匙,并且很好心地为每个用户保 存了一个钥匙的备份。遗憾的是,CSDN把一长串的钥匙搞丢了,而且每把钥匙上还有我们的住址门牌号。CSDN其实是锁,钥匙不能和锁放在一起,这是最基 本的常识。锁只知道自己的洞洞的形状,但不应该知道钥匙的形状。锁当感觉有东西插入自己的身体的时候,不管这东西是真的钥匙,还是火柴杆,如果锁觉得爽, 就卡的开了。原理就这么简单。为了保证不管是真的钥匙,还是火柴棍,只要锁感觉爽,就一定要打开这个原则,锁是通过比较一串字节码来确定自己是否爽,这也 很容易理解,真的钥匙会触到她的痒痒肉——李银河老师叫它G点——还不明白就问苍老湿。这串字节码就是钥匙上的锯齿。钥匙上的锯齿理论上是毫无规则的。那 么,比较这个字节码是否一致就是锁感知钥匙的过程。锁总要有凭据来验证钥匙对不对。对于CSDN的实现来讲,它们简单地复制了一份钥匙拴在锁上,然后把用 户插进来的那个钥匙和自己的进行比较。这种做法是不对的,错就错在:锁如果丢了,连带钥匙也丢了。你见过谁家把锁和钥匙放一起的吗?
第二:MD5。数学家提供给我们许多很巧妙的算法,用来解决钥匙齿的生成问题,它们都遵循下面4个定律:
Rule-1)如果输入一堆东西,不管是什么,不管多少,总对应一个固定大小的输出(钥匙齿)
Rule-2)如果输入不同,那么输出就一定不同(或者在极小的概率内相同)。
Rule-3)如果输入相同,那么输出就一定相同。
Rule-4)如果输入有一丁点不同,比如输入2头驴,其中一头仅仅比另一头多了一根毛,那么输出就截然不同。
例如:
输入一本书--->MD5--->输出一串固定长度的数字,如132234532495435343243245
输入一个太阳--->MD5--->输出一串固定长度的数字,如9384845739237439254357439
输入一个银河系--->MD5--->输出一串固定长度的数字,如675454365464564354656334
巧妙吧。但是从输出,无论如何我们也不能得到输入的是什么。
其中一个算法就是MD5。MD5处理输入的过程有人叫加密,有人叫签名。不管怎么称呼,都是不能根据输出来破解出输入的。理论上的确存在输入一只狗和一只航天飞机,得到的输出结果确是一样的情形,这种特例就和你不小心用黄瓜打开了一把锁的概率差不多。
考 虑把输入当成密码的原文,而锁只保存MD5的输出结果,这样,用户在客户端页面输入密码之后,立即被MD5成固定长度的输出,然后把这个输出发送到 CSDN那里,CSDN为每个用户保存了一个密码的MD5输出,通过比较这个输出,就知道是不是密码匹配了。如果CSDN保存的是MD5的输出。那么此次 泄密的后果会小的多。因为我们无法从输出得到输入,也就无法知道密码。而存放明文密码是严厉禁止的。CSDN搞的跟“受害”者似的,其实“受害”的是用 户。
第三:仅仅保存密码的MD5的输出还是不够的。很 多情况下,很多人设置的密码是相同的。那么相同的密码MD5处理得到的输出定长字符串就一定是一样的(Rule-3)。这给恶意的人猜中密码的机会。所以 还需要加点佐料,让任何的输入都不一样,这个佐料我们称它为Salt——盐,不同的盐被加入到密码里搅拌,这样任何的输入就不同了。对于用户名——密码的 情形,这个盐就是随机生成的字符串或数字而已。这样CSDN在用户的验证数据库中至少要保存密码加了盐之后的MD5值,当然也要保存盐值。用户登录的过程 就变成:
1)***用户输入用户名和验证码,向CSDN发送登录请求
2)CSDN检查验证验,然后根据用户名到数据库里找到用户存储的盐返回给用户(验证码错误是不能返回盐的)
3)用户输入密码,然后在网页客户端用javascript把盐撒到用户的密码上,搅拌,然后MD5,得到输出
4)用户发送这个输出给CSDN——passport服务器
5)服务器把用户提交的MD5输出直接和数据库中存储的输出值做是否相等比较,一致就通过,不一致就拒绝。
***之所以强调用户首先输入验证码,是防止模拟自动机自动登录。遗憾的是目前CSDN的登录流程仍然存在问题,验证码居然是输入密码之后才出现的。
盐是用来保证,即使有人把用户数据库的资料泄密了,别人也无法轻易猜测出密码来。没有盐的加入就会导致MD5值大量一致的情况。
如 果没有盐,当我恰好知道自己的密码的MD5恰好和她的密码的MD5值一样,而我的密码是iloveu,那么她的密码一定就是iloveu。有了盐,即使我 知道她的盐,因为MD5出来的差异大不同(Rule-4),所以我也无法知道她的密码,即使我们的密码是一样的。盐是要确保每个用户都是不一样的。一般的 随机算法或时间函数都能实现这一点。
盐如果泄密了,黑客仍然
能够通过穷举法得到我们的密码。方法是黑客使用与我们相同的加盐和搅拌方法,得到MD5值。所以就引入了一次一密的登录加密方法,一次一密不是我们每次都
要改登录密码,而是我们每次登录之后,盐都是要重新计算,更新——我称这个是酱油。这给黑客破解我们的密码增加了相当大的难度。我怀疑CSDN没有引入这
个酱油,最多是加了碘盐。
其实,黑客不需要知道我们 的密码,它们只需要截断消息,伪造session和消息,就能冒充我们。因此对于网上银行一类的网站,光有盐和酱油还是远远不够的。这就牵扯了ssl,证 书,key,短信,token等等一堆的东西。网站不但要验证我们,我们也要验证网站:对于用户,你必须是我信赖的网站;对于网站,你必须是我的用户。
第五:希望CSDN有盐。如果有空就把酱油也加进去吧。