有小伙伴去面试问到这样一道场景题:“为什么忘记密码会要求重置而不是直接告诉你原密码呢?”
不知道大家平时忘记密码的时候有没有想过这个问题。回答这个问题其实就一句话:因为服务端他也不知道你的原密码是什么。如果知道的话,那你就回去等通知吧,因为这就是严重的安全风险问题了。
那做过开发的应该都知道,服务端在保存密码到数据库的时候,绝对不能直接明文存储。如果明文存储的话,风险太大,且不说数据库的数据有被盗的风险,如果被服务端的相关人员特别是有数据库权限的恶意利用,那将是不可预估的风险。
那我们通常我们会通过哈希算法来进行加密,哈希算法的是不可逆的,你无法通过哈希之后的值再得到原值,这样的话,服务端也不知道你的原密码到底是什么,自然没办法告诉你原密码是什么。
常见的哈希算有:MD5 \SHA-256\Bcrypt
先说下MD5 : 这种加密算法呢,不同密码加密后他有可能会生成相同的哈希值,也就是我们说的哈希冲突了。
那SHA-256 呢,不同密码加密后哈希冲突的情况极低, 所以他比MD5抗碰撞能力更强。
还有就是MD5和SHA-256每次加密同一个密码都是固定的密文,所以可能会有暴力破解的风险。
所以我们通常会采用SHA-256+ 盐的方式进行加密, 什么是盐呢? 说白了就是只有我们程序员知道的特定的字符串, 这样可以有效防暴力破解。 但是盐也有可能被泄露。
所以我更推荐Bcrypt方式,因为他自带盐而且每次盐还不一样,所以每次加密同一个密码 都可能密文不一样, 就更难破解了!