催生这篇文章的一个原因是一位讲了半天听不懂原理还不虚心学习的群友。
小笑话
想必大部分人肯定也有这样的经历,就是用数据库新增一个用户的时候,因为加了密所以把现有的账户复制了一条,然后改了用户名,便新增了一个用户。
但是最后发现怎么也登录不了,这是怎么回事呢?
其实原因也很简单,一个很简洁的解释:
说明密码加密算法和用户名有关,比如salt
如果你单看这句话已经明白了,那么你已经掌握了这个知识,如果还不明白,那么继续往下阅读。
加密算法加盐
设计一个满足群友所有条件的实验。
前提条件
假设有两个加密算法 加密算法A 加盐算法SALT
且数据库中存储
用户名A/加密密码B
用户名C/加密密码B
加密算法+盐
盐的加密方法是 加盐算法SALT(用户名)
最终你的加密算法是 加密算法A(明文密码, 加盐算法SALT(用户名))
登录
用户A输入了 明文密码M1
用户A最终加密结果是 加密算法A(明文密码M1, 加盐算法SALT(用户名A))
最终校验通过 加密算法A(明文密码M1, 加盐算法SALT(用户名A)) = 加密密码B
用户C输入了 明文密码M1
加密算法A(明文密码M1, 加盐算法SALT(用户名C))
最终校验不通过 加密算法A(明文密码M1, 加盐算法SALT(用户名C)) != 加密密码B
再把两者的最终结果做对比。
结果
加密算法A(明文密码M1, SLAT(用户名A))
加密算法A(明文密码M1, SLAT(用户名C))
这里的用户A和用户C可以被抽象为“被加盐内容”,最后就可以推出上面说的那句话。
说明密码加密算法和用户名有关,比如salt
思考
以上的实验是在我们知道有加密+盐这样的加密方式的时候,才能马上反应过来的。
当你的思路局限在诸如MD5加密这一种方式的时候,你也不可能考虑到,这会跟用户名有关系。
MD5(明文密码)
那么为什么会有这样的加密方式出现呢?
为什么用?
虽然像MD5这类的摘要算法是没办法反推明文的,但是反着不行就有人发明了彩虹表,将摘要后的结果和原文存储下来,只要摘要结果匹配上,基本上你的原文也就泄露了,当彩虹表达到一定的体量以后,完全可以破解简单的密码。
所以现在又有很多方式去解决这样的问题,例如用如下方式
MD5(MD5(原文))
嵌套多层加密的方式,当然这也是一种方法,但是为了保证密码加密后的唯一性,又有一种加密算法+盐的方式出现,这里的盐尽量的唯一,可以最大程度的保证密码的唯一性。
当然方法有很多,加密方式你可以按自己的方式随意组合,你要保证的是加密算法的保密性。
总结
- 加密算法+盐 = 加密算法(被加密字内容, 加盐算法(被加盐内容))
- 加密算法中加的盐不同,产出结果不同。
- 一线开发人员依旧对简单的加密算法没有概念。
参考资料
文章中出现的任何错误欢迎指正!共同进步!
最后做个小小广告,有对WEB开发和网络安全感兴趣的,可以加群一起学习和交流!
QQ:425343603