如何让用户可以正常登录,同时不怕数据库被盗?
每个网站都会设计自己的帐号系统,用户不管是通过QQ还是微信登录过来的,大多数网站都是想把他们转入到自己的帐号系统,因为这样估值的时候,这个用户才是你的用户,才好把故事讲好。那这些用户名和密码该如何存储才安全呢?或者说即使被「脱裤」了,如何才能不被黑产利用呢?
最近两年曝光的事件,发现有几个公司的密码库居然是明文存储的,也就是“果果,123456”这样的存储方式,小学生都看得懂,直接可以登录了,还谈何安全。
具体是那几个公司就不说了,以免有为他们做广告,帮助他们东山再起的嫌疑(东山再起运用了夸张的修辞手法,你懂的,我是吹了个牛逼)。
所以,问题抽象为——如何让用户可以正常登录,同时不怕数据库被盗呢?先看看如下图最原始的数据库设计。
最原始的数据库设计肯定是这样的,想都不用想,被攻破,所有用户密码就泄漏了,小明和小红所有的隐私也都泄漏了。
程序员不服输,那我不让Password字段是密码不就可以了,于是变为了这样,密码是做了MD5(MD5传送门:名词解释:时间戳、MD5、GUID)之后的密文,这样用户登录的时候输入123,后台对比Md5(123)是不是202cb****这段数据,就能证明输入正确与否了。
理论上MD5是单向的,也就是一个字符串会生成一个唯一的MD5码(有开发同学就别较真了,我知道理论上不唯一会冲突,但概率非常小,产品经理请继续认为基本唯一),这种情况下,数据库泄漏了,有风险吗?
答案是有风险,因为还有一帮程序员更聪明,发明了叫彩虹表的东西,彩虹表是把字符串和这些MD5值对应起来做了一个大数据库,也就是知道了202cb****这段数字之后,会反向查找出字符串,也就拿到了明文的密码。这个彩虹表一般都是上百个G的数据,所以用MD5或者SHA这些算法来保护密码也有漏洞。
程序员又不服,继续探索新的方法,客官注意了,我们马上进入到高潮部分,讲述如何用「加盐」来解决这个问题。
如上图所示,我们加了一个新的字段叫Salt,翻译过来就是盐,这个字段是用户注册的时候随机产生的一个字符串,所以这回我们生成数据库中的密码就是这样生成的:Md5(“123” + “jakldsfjn234jkl234jkl;123″)=6bbf7f8dd1f7dd3d7c03182620ba312f,当用户输入123的密码时,后台也用这个算法来验证是不是可以正常登录。
假设数据库又被窃取了,这个时候拿到的密码库的Password字段是两个字符串拼接的Md5值,这个时候由当前的密码会得到“123” + “jakldsfjn234jkl234jkl;123”的字符串拼接的值,但是要区分出哪些部分是密码成本是非常高的,而且这个salt可以夹杂在123这个字符串的任何位置,甚至可以将盐分开比如1前面放三个字符,2后面两个字符,剩下的接到3的结尾。
数学推理,果果也没有求证和推演过,总之时间成本会令这种破解收益非常非常小,从而保护了密码库的安全。
#专栏作家#
给产品经理讲技术,微信公众号(pm_teacher),人人都是产品经理专栏作家。资深程序猿,专注客户端开发若干年,对前端、后台技术略懂,热衷于对新的科技领域的探索。
本文原创发布于人人都是产品经理。未经许可,禁止转载。
-
微信创始人张小龙首次公开演讲(官方无删减版)
微信创始人张小龙首次公开演讲(官方无删减版) -
如何通过APP看到产品战略层面
产品经理拿到一款产品的时候,不能只能看到表面信息,而是要能看到产品背后的信息。 -
基于用户的“真需求”创新产品
产品创新是保证企业在竞争激烈的市场上长久生存的关键,今天,我们就围绕产品创新和用户研究分享一些看法。 -
有一种交互设计研究验证叫“设计走查”
如何在最短的时间内对自己的产品做出检验,确保其在定位、设计、营销计划等多个环节,在可视范围内是正确的,需要一套比较科学、完善的方法去做出检测。 -
你为什么离不开微信?
张小龙说用完即走,你却爱不释手; 到底是什么让你离不开微信? -
移动互联时代APP的发展方向
现在我们已经走上了移动互联网时代,无论是企业还是公司,都会经过网络竞争中争取有利的优势,较为传统的产品竞争逐渐向互联网竞争转型,出现了很多数据云大数据等等 -
AI 时代产品经理的机遇和挑战
AI 时代产品经理的机遇和挑战 -
前1%与前10%的产品经理差距在哪?
前1%与前10%的产品经理差距在哪? -
你有哪些策略应对不断的需求变更?
你有哪些策略应对不断的需求变更? -
如何运营天猫【十亿俱乐部】商家页面?
如何运营天猫【十亿俱乐部】商家页面?

