大家有没有想过这样的问题:如果我在不同的网站,或者不同的软件申请账号时,使用了相同的密码,会不会导致两者相互影响?比如说,如果我的微信和支付宝用同一个密码,那么微信的某个数据库管理员是不是就可以通过看到我的微信密码而登录我的支付宝呢?
这其实是个非常现实的问题!其实程序员们早早地就开始思考了。我以前也担心过,毕竟自己为了方便,在申请新账号的时候就用自己比较常用的密码,省得再记。然后我就担心,一些流氓软件是不是会偷走我的密码到其他软件上尝试。
事实上,这个担心大部分时候是不必要的,但是这也取决于你申请账号的互联网公司的负责程度。一个很出名的事情是之前CSDN的泄露门,感兴趣的可以搜一下。大概就是,CSDN作为技术性博客平台,竟然用明文存储用户密码,而且很多密码还遭到泄露。
这其实也说明了,大部分平台并不是在用明文存储用户密码,他们往往要进行加密。下面我讲讲具体的方法。
在你创建账号的时候,你输入了用户名和密码,他们被传到后台,用户名以明文的形式被存放在数据库,而密码往往要经过加密,这个加密是一个单向的函数对应;就是说密码经过加密得到的加密密码是唯一的,而且,随便给一个密码,我都能构造出加密密码。下面我把加密写作一个函数:加密(密码)。现在数据库中存储了 用户名 和 加密(密码)
现在,如果我们想登陆,我们要输入用户名和密码。此时,服务器会先对应用户名,然后把我们输入的密码进行加密,去与数据库中存储的 加密(密码)进行比对,如果符合,则登陆成功。
其实这与我们想象的登陆过程在后台的实现没有什么区别,只不过增加了一个加密过程。
回想一下为什么我们需要这个过程。其实是为了避免别人看到我们的密码。那么这个加密就要有秘密感,不能是简单的变换(战争时期的加密就是简单变换);要让我们不能通过加密密码反推密码(这个很关键)。事实上,大家惯用的一个叫做MD5码是最常用的加密方法。MD5码可以对任何长度的文件、文字进行加密,得到一串16进制字符。这个加密过程,或者说转换过程会产生一个很独特的MD5码,研究发现,不同的文件、或密码产生的MD5码几乎不会重复。也就是说MD5码具有很强的识别性,就像人的指纹一样。但是同样也有一个问题,不同的文件或者密码偶尔会产生相同的MD5码,好在概率相当小,大部分时候可以忽略,就像至今全世界也没有两个指纹完全相同的人一样,但是终究(人越来越多)会有的。
但是这样的特点给予MD5码不可破解性,当然你可以通过正面暴力破解,通过计算出所有密码组合的MD5码来找密码,但是理论上我们是无法通过给定的MD5码找到对应的密码的(因为不只有一个)。
服务器自动假设,MD5码比对成功代表密码比对成功,这其实也是合理的。
总而言之,我们的密码基本上是以加密密码的形式存于数据库的,找回密码的功能不可能真正帮你找回自己设置的密码,只能让你重新输入新的密码替换掉,因为即便是数据库,也没有存储你的真正密码,你的密码在设置之后就完全消失了,只是以加密的形式存储于数据库。所以不用担心自己重复使用密码会怎么样啦。
顺便提一句,由于传统的加密比较容易暴力破解,人们会在加密前添加一些随机字符串,这个字符串叫做salt, 是与用户有关的,同样被存储在数据库中,加密现在变为 加密(密码,salt) 的二元函数,因此破解不像原来只要得到所有密码组合的加密结果即可;而是要针对不同的salt生成所有密码组合的加密结果,这样使得破解的时效性相当低,因而是一个更为优秀的密码存储方法。
没有评论:
发表评论