密码安全
密码的作用:
证明你是你
密码-对比
存储的密码 <----对比----->输入的密码
只有用户知道,密码是一定要私密的,密码的作用就是对比
密码-泄露渠道
- 数据库被偷
- 服务器被入侵
- 通讯被窃听
- 内部人员泄露数据
- 其他网站(撞库)
密码-存储
- 严禁明文存储(防泄露)
- 单向变换(防泄漏)
- 变换复杂度要求(防猜解)
- 密码复杂度要求(防猜解)
- 加盐(防猜解)
密码是可以通过哈希算法(信息摘要算法)进行加密
- 明文-密码 一一对应
- 雪崩效应:一个字符不一样 密文就完全不一样
- 密文-明文 无法反推
- 密文固定长度
- 常见的哈希算法:md5,sha1.sha256
密码-md5单向变换
没法逆推,但是可以通过查表得知
密码-单向变换彩虹表
这里是只进行了一次md5加密,我们可以通过加载变化的复杂度。
- md5(明文) = 密文
- md5((明文)) = 密文
- md5(sha1(明文)) = 密文
- md5(sha256(sha1(明文))) = 密文
通过复杂的密码来对抗彩虹表,一般来说彩虹表收录的都是比较简单的。
密码-加盐
原始密码+盐再变化生成新的密码
md5(sha1(md5(ID+fsdjks+原始密码+fsdf+盐)))
- 密码的变换次数越多越安全
- 加密成本几乎不变(生成密码时的速度慢一些)
- 彩虹表失效(数量太多,无法建立通用性)
- 解密成本增大N倍。
var password = {};
var md5 = function (str) {
var crypto = require('crypto');
var md5Hash = crypto.createHash('md5');
md5Hash.update(str);
return md5Hash.digest('hex');
}
password.getSalt = function() {
return md5(Math.random()*999999 + '' + new Date().getTime());
}
password.encryptPassword = function(salt, password) {
return md5(salt + 'sfdhjkhjkf23@#' + password);
}
module.exports = password;
var salt = password.getSalt();
var newPassword = password.encryptPassword(salt, user.password);
密码 - 密码传输的安全性
- https传输
- 频率限制
- 前端加密意义有限
频率限制 防止多次尝试密码
传输层窃听 明文密码
密码 - 生物特征密码
- 指纹
- 声纹
- 虹膜
- 私密性 - 容易泄露
- 安全性 - 碰撞
- 唯一性 - 终身唯一 无法修改