密码安全
zKing 2018-11-26 Web 安全
# 密码的作用
- 密码的作用在于对比,“证明你是你”
- 原理:存储的密码与输入的密码进行对比
# 密码的存储
一般存储到数据库中
# 密码泄露渠道
- 数据库被偷
- 服务器被入侵
- 通讯被窃听
- 内部人员泄露数据
- 其他网站(撞库)
- 所谓撞库,就是虽然是不同的网站,但是用户使用的是相同的账户和密码
# 密码防泄露方法
严禁明文存储
# 哈希算法
其实就是信息摘要算法
- 特点
- 明文与密文一一对应,且无法反推
- 雪崩效应
- 只要明文有一点点不一样,密文就大变样
- 密文固定长度,一般是32位的字符串
- 常见哈希算法:md5,sha1,sha256
单向变换彩虹表
可以简单地进行密文逆推,所以加密操作时,不能只用一种哈希算法
# 密码防猜解方法
- 变换复杂度要求
- 密码复杂度要求
- 加盐
- 自己定义一个
乱七八糟
的字符串,然后附加在“需要加密的数据”的头部或者尾部,再一起进行加密
- 自己定义一个
# 简单示例
const crypto = require('crypto');
let salt="%ZUdGV2JG-b=DNXa2"
module.exports = {
md5: (str) => {
return crypto.createHash('md5').update(str+salt).digest('hex');
},
sha1: (str) => {
return crypto.createHash('sha1').update(str+salt).digest('hex');
},
}
# 密码变换次数越多越安全
- 加密成本几乎不变(生成密码时速度慢一些)
- 彩虹表失效(数量太大,无法建立通用性)
- 解密成本增大 N 倍
# 提高密码的传输安全性
- https传输
- 频率限制
- 前端加密(意义有限,防止用户明文密码被泄露)
# 密码的替代方案
# 生物特征密码
指纹,唇纹,声纹,虹膜,人脸等
# 问题
- 私密性--容易泄露
- 安全性--碰撞
- 唯一性--终身唯一,无法修改
# 总结
在不考虑生物特征密码的情况下的防御方案
- 有需要的话,前端要进行数据加密后再进行传输
- 有能力的情况,使用 https 协议进行数据传输
- “加盐”,并且使用多种加密方法进行数据加密后再存储
- 限制用户的登录频率,比如一分钟内最多只能登录三次这样子。