最近 , 国内知名安全团队乌云漏洞平台曝出了网易邮箱所遭到的一次大范围攻击 , 称上亿用户的账号密码以及安全提示问题和答案被泄露 , 同时有很多用户称自己的Apple ID等账号遭到窃取 , 密码被改 , iPhone手机被锁定并遭到敲诈 , 而这些用户都是将网易邮箱作为Apple ID来使用的 。 在此之前 , 也有一些网站出过类似的安全事故 , 而即便有了如此多的教训 , 很多网站在保存和管理用户密码这件事上依然做得十分糟糕 , 这成了信息安全的一个严重的短板 。
在一般的身份认证体系中 , 账号(也就是ID)和密码是配合使用的 , 也就是说 , 账号用来识别这个用户是谁 , 而密码用来识别这个用户是不是他本人 , 因为我们一般假定密码只有用户本人才知道 。 既然如此 , 那么网站必须要保存用户的账号和密码才能完成身份确认 , 而一般来说 , 账号和密码是保存在网站后台的数据库系统中 , 比如说类似这样一张表:
文章插图
这样一来 , 当用户输入账号user1 , 密码123456时 , 网站就能从数据库中找到相应的用户 , 然后再检查一下密码对不对 , 密码对了就登录成功 。 不过 , 这种原原本本保存用户密码的方法其实很不安全 , 因为一旦攻击者通过某种方式获取了后台数据库的访问权限 , 就能够轻松地取得所有用户的账号和密码 。 我们知道 , 人类的记忆力其实十分有限 , 大多数用户在不同的网站上用的其实是同一套账号和密码 , 只要其中一个网站的账号和密码泄露出去 , 造成的后果是不堪设想的 , 因为攻击者可以用这些信息碰运气 , 说不定可以登录其他很多网站 , 如果那些网站仅仅是论坛、社区、博客之类的还好 , 而如果是支付宝或者银行呢?
实际上 , 如果时间倒回到十几年前 , 恐怕大部分网站都是用这种方式来保存用户的密码的 , 想想就令人毛骨悚然呢 。 不过 , 业界对于安全的追求也并没有懈怠 , 很快人们就发现这样做实在不靠谱 , 于是开始想办法进行改进 。 改进的思路其实也不难 , 既然密码只是用来验证对不对的 , 那么网站其实并不需要保存密码本身 , 而是只要保存一个密码的“指纹”就行了 。 这里的“指纹”用的是一种叫做“散列函数”(hash function)的算法 , 简单来说 , 对于任意的信息 , 通过散列函数可以生成一段摘要 , 也叫散列值 , 散列值的长度是固定的 , 比如如果我们把123456输入一个叫做MD5的散列函数 , 得到的散列值为:e10adc3949ba59abbe56e057f20f883e 。 散列函数有一个特点 , 那就是它是一种单向算法 , 也就是说 , 已知一段信息可以算出一个确定的散列值 , 但已知一个散列值却无法算出原始信息 。 有了散列函数的帮助 , 网站可以像下面这样保存密码了:
文章插图
当用户登录时 , 比如说输入账号user1 , 密码123456 , 网站先计算出123456的散列值 , 然后再与数据库中保存的散列值进行对比 , 如果一样就说明登录成功了 。 那么疑问来了 , 如果用户输入的密码不是123456 , 就一定不能得到和数据库中保存的一样的散列值吗?事实上 , 散列函数是一种多对一的映射 , 因为信息的长度可以是任意的 , 但散列值永远只有固定的长度 , 就像把100个球放进10个袋子里 , 必然有至少一个袋子里面得装多于一个的球 , 换句话说 , 必然存在两条不同的信息 , 它们的散列值恰好是一样的 , 这种情况叫做散列碰撞 。 尽管对于散列函数来说 , 碰撞是必然存在的 , 但是一个好的散列函数可以让碰撞足够分散 , 使得攻击者无法人为地制造出碰撞 , 不幸的是 , 我们上面提到的MD5就是一个不太好的散列函数 , 它的抗碰撞性已经很差了 , 或者说已经很不安全了 , 然而 , 根据乌云平台的描述 , 网易邮箱依然在使用MD5来保存用户的密码 , 也是醉了吧?在常用的散列函数中 , MD5已经被淘汰 , SHA-1的安全性也较弱 , SHA-2是主流 , 而SHA-3则具备更高的安全性 。
推荐阅读
- 如何忘记你的前任?
- 空腹喝酒是大忌,酒前吃什么好?
- 这些生活中常见的东西,居然是科学未解之谜?
- 神秘的“鬼压床”究竟是什么?
- 雪梅的思想感情 雪梅的中心是什么
- 天冷手脚冰凉,是一种病吗?
- 习大大访英也要看的医疗机器人,到底是啥?
- 自相矛盾文言文翻译 自相矛盾文言文翻译是什么
- 欲钱买千年一世缘的生肖欲钱买千年一世缘是什么
- 餐厅服务生形象设计