核心目标:保证用户账号和密码的存储安全,避免被“脱裤”。
首先,用户账号和密码不能明文存储,例如“鱼鱼,123456”的存储方式,见下图:
如果这样存储数据,一旦数据库被黑客攻破,所有用户和密码均被泄露。
其次,大部分公司的程序员都会做MD5加密处理。参考:https://www.zhihu.com/question/19984234。MD5是一个散列函数,如果直接把密码做MD5(这是一个公开且稳定的算法)加密处理,黑客拿到之后可以暴力破解,比如黑客把能收集到的真实密码及其MD5值做成查找表,这就是所谓的“彩虹表”。下图为经MD5加密的存储方式:
彩虹表是把字符串和MD5值对应起来的大型数据库,可以通过MD5加密过后的密码(上面Password这一列对应的数据 )反向查找出对应的真实密码,一般彩虹表有上百G的数据,所以用MD5或SHA算法保护的密码也有漏洞。
最后,更为聪明的程序员们采用“加盐”的方法来解决这个问题。
增加一个新的字段Salt(盐),该字段是用户注册时随机产生的字符串,所以数据库中的密码生成时为:MD5 ("321"+"jakldsjgfljs231sad231;321 " )=202cb962ac95075b964b071452d234b70,当用户输入密码321时,后台用这个算法来验证是否可以正常登录。
假设数据库这时被窃取,黑客拿到的密码库Password字段是"321"+"jakldsjgfljs231sad231;321 "拼接的值,即"321jakldsjgfljs231sad231321"。
注意!!!Salt字段可以夹杂在实际密码字符串(321)的任何位置,甚至Salt也可以分开插入到实际密码的任何位置,也就是说可以在3前面放两个字符,2和3中间放5个字符,2后面放4个字符,其他的放到1后面。这样会让黑客破解密码的时间成本非常非常高。
评:任何密码(防火墙)都可以被破解(攻破),就看值不值花时间去破解(攻破)了。由此可见,安全防护的一个经典思路就是如何用很简单的方法大大增加黑客破解的成本(时间、经济、机器)。