网站密码加密原理(初级篇)

http://blog.chinaunix.net/space.php?uid=26567841&do=blog&id=3047743

――致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有盐。

如果有空就把酱油也加进去吧。

发表评论

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

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>