用户密码,连系统都不能知道
口播文案
有位朋友在最近面试的时候
突然被面试官问了一句
你们项目的用户名密码是怎么保存的
这位朋友都没有思考
顺口就说直接保存到数据库里呗
小心这一句话
就会彻底暴露出你的小白本质
再说什么你有几年工作经历
那都没有用了
大家好我是楼兰
这次呢我用一张图
带你彻底看懂
在真实项目当中
用户密码到底应该怎么处理
从方案到算法
一步步给你讲透
帮你保持住高手的风范
轻松收割offer
先看最基础的明文存储
这是最不用思考的方法
用户输一个1314520
那数据库里面就存一个1314520
任何算法都不需要用这种方式呢
简单高效
验证密码也简单
但是且不说
一旦遇到了黑客
所有密码就都一览无余了
而且一旦你的系统数据比较敏感
你也很难防止
内部有数据库操作权限的人
不会偷偷看一下用户的关键密码
这在真实项目当中
直接明文保存密码
是被列为绝对禁用的
方案比较好一点的方式呢
是进行哈希的加密
哈希加密算法就像一个搅拌机
原始密码输入进来之后
哈希算法
就会算出一个看不懂的乱码出来
在数据库里保存的就是一些乱码
那么即使黑客看到了数据库里的数据
也无法直接拿到原始密码
常用的哈希算法
如MD5 SHA256等
都还能够保证
加密后的密文
是不能够逆运算推算出原始密文的
这样可以进一步保证用户密码的
安全性不过这也意味着
应用系统自己
也不知道用户的原始密文是多少
登录后
只能通过加密后的密文来进行核对
但这样就足够安全了吗
还不够对于哈希算法的研究
黑客可一点不比程序员差
黑客会提前算好常用密码的乱码
做成一本词典
业界称为彩虹表
获取到用户密码的密文后
只要和彩虹表中的密文进行比对
就能破解出用户的原始密码来
但是彩虹表保存常用密码毕竟有限
所以现在很多系统
都会推荐用户
设置一些复杂的密码组合
比如必须包含字母数字符号的组合等
还有很多系统
会要求用户定时的修改密码
这都是在为了
加大黑客破解密码的难度
但是这种方法呢
毕竟属于治标不治本
真正成熟的终极防御方案是加盐
这里的盐可不是炒菜加的盐
是一段随机的字符串
在进行哈希计算前
给密码随机的加上一把盐
这样加出来的密文就更加混乱了
当然这种方案也有高下之分
有些时候呢
程序员会偷懒
给整个系统设置一个固定的盐
但这个盐还是会有泄露的风险
更严谨的方式是
给每个人设置不同的盐
简单点的
可以使用用户ID的某几位做盐
高端点的
会在每次生成密码时
也随机生成一个盐
比如bcrypt算法就是这样一种算法
它在每次生成一个新的盐
再把盐一起加密到密文当中
这样就彻底断绝了
黑客破解用户密码的念想
当然程序员对密码的思考
其实远远不止验证个用户名和密码
这么简单
其实之前对于密码的设计
一个很重要的原则就是只验证不窥探
系统只能正向的验证
你输入的密码是否正确
但是永远无法从存储的乱码中
反推出你的原始密码
所以你会发现
忘记密码的时候
现在的线上系统
都只能让你重置一个新的
而这个原则
其实也不止用在
验证用户名和密码的简单场景
在很多复杂的分布式场景当中
密码也会设计的更加的复杂
更加的安全
但是基本的原则就是这个
只验证不窥探
最后呢对于这次聊的这些方案
也不能光说不用假把式
这个表格当中
列出了现在很多项目当中
最常用的几种加密算法
以及他们的优缺点的比较
需要的朋友截图保存
另外呢大家听完还有什么问题
欢迎交流
我这边给大家整理了一份
120万字的项目场景面试宝典
里面有类似的几百个项目场景
面试问题的梳理
最近要面试的朋友留下 888