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

 

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

——致CSDN们php

我原本不想写这么初级的文章,可是发生了CSDN这当子事情以后,我还得真得写点入门级的文章,给大家科普科普。java

第一:什么是密码。

通俗地讲,密码就是进入一道门的钥匙。而之因此咱们能找到咱们要进入的门,靠的是门牌号。那么门牌号就是用户名。不知道我这么讲,大家能不能听明白。钥匙就是带锯齿的小铁片,插到一个铁作的洞洞里,若是恰好吻合,旋转一下,就卡擦一声,打开了。简单吧。打开了门,就发生了人类说不完的故事。算法

可是人类发明了钥匙和锁以来,历来没有破解不了的锁。这也算是锁的悲哀。数据库

一般咱们从商店里买来的锁带有3把钥匙,而锁厂是不能留下一个备份的。但是,如今的情形不是这样子,CSDN给咱们每人一把钥匙,而且很好心地为每一个用户保存了一个钥匙的备份。遗憾的是,CSDN把一长串的钥匙搞丢了,并且每把钥匙上还有咱们的住址门牌号。CSDN实际上是锁,钥匙不能和锁放在一块儿,这是最基本的常识。锁只知道本身的洞洞的形状,但不该该知道钥匙的形状。锁当感受有东西插入本身的身体的时候,无论这东西是真的钥匙,仍是火柴杆,若是锁以为爽,就卡的开了。原理就这么简单。为了保证不论是真的钥匙,仍是火柴棍,只要锁感受爽,就必定要打开这个原则,锁是经过比较一串字节码来肯定本身是否爽,这也很容易理解,真的钥匙会触到她的痒痒肉——李银河老师叫它G点——还不明白就问苍老湿。这串字节码就是钥匙上的锯齿。钥匙上的锯齿理论上是毫无规则的。那么,比较这个字节码是否一致就是锁感知钥匙的过程。锁总要有凭据来验证钥匙对不对。对于CSDN的实现来说,它们简单地复制了一份钥匙拴在锁上,而后把用户插进来的那个钥匙和本身的进行比较。这种作法是不对的,错就错在:锁若是丢了,连带钥匙也丢了。你见过谁家把锁和钥匙放一块儿的吗?服务器

 

第二:MD5。

数学家提供给咱们许多很巧妙的算法,用来解决钥匙齿的生成问题,它们都遵循下面4个定律:session

Rule-1)若是输入一堆东西,不论是什么,无论多少,总对应一个固定大小的输出(钥匙齿)ide

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

若是有空就把酱油也加进去吧。

 

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

相关文章
相关标签/搜索