密码的作用---证明是你
密码的存储
密码的传输
密码的替代方案
生物特征密码的问题
密码-泄露渠道
- 数据库被偷
- 服务器被入侵
- 通讯被窃听
- 内部人员泄露数据库
- 其它网站(撞库)
密码-存储
- 严禁明文存储(防泄漏)
- 单向变换(防泄漏)
- 变换复杂度要求(防猜解)
- 密码复杂度要求(防猜解)
- 加盐(防猜解)
密码-哈希算法
- 明文-密文---一一对应
- 雪崩效应
- 密文明文 无法反推
- 密文固定长度
- 常见哈希算法:md5,sha1,sha256
加密次数越多,复杂度越大,就越可以对抗彩虹表
密码-变换次数越多越安全
- 加密成本几乎不变(生成密码时速度慢一些,但对破解者是致命的)
- 彩虹表失效(数量太大,无法建立通用性)
- 解密成本增大 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()*99999+''+new Data().getTime()); } password.encryptoPassword = function(salt, password) { return md5(salt + 'af@#$%^asda&' + password); } module.exports = password;
密码验证
// 如果用户没有salt,需要升级 if (!user.salt) { var salt = password.getSalt(); var newPassword = password.encryptPassword(salt, user.password); await query( `update user set password = '$(newPassword)', salt = '${salt} where id = ${user.id}'` ); user.salt = salt; user.password = newPassword; } var encryptPassword = password.encryptPassword(user.salt, data.password); if (encryptPassword !== user.password) { throw new Error("密码不正确"); }
密码传输的安全性
- https 传输
- 频率限制
- 前端加密意义有限
在前端加密需要安装js-md5模块,运行jspm install node:js-md5
前端进行加密,这是前后端要有相同的盐 SUGAR
var SUGAR = "!@#¥@#@¥#¥%GDF456¥%"; daat.password = md5(data.username + SUGAR + data.password);
var password = {}; var md5 = function(str) { var crypto = require('crypto'); var md5Hash = crypto.createHash('md5'); md5Hash.update(str); return md5Hash.digest('hex'); }; password.getPasswordFromText = function(username, password) { var SUGAR = '!@#¥@#@¥#¥%GDF456¥%';//与前端一致 return md5(username+ SUGAR + password); }; password.getSalt = function() { return md5(Math.random()*99999+''+new Data().getTime()); } password.encryptoPassword = function(salt, password) { return md5(salt + 'af@#$%^asda&' + password); } module.exports = password;
if (!user.salt) { var salt = password.getSalt(); var newPassword = password.getPasswordFromText(user.username, user.password); var encryptedPassword = password.encryptPassword(salt, newPassword); await query( `update user set password = '$(newPassword)', salt = '${salt} where id = ${user.id}'` ); user.salt = salt; user.password = encryptedPassword; } var encryptPassword = password.encryptPassword(user.salt, data.password); if (encryptPassword !== user.password) { throw new Error("密码不正确"); }
生物特征密码
- 指纹(唇纹)
- 声纹
- 虹膜
- 人脸
生物特征密码
- 私密性-容易泄露
- 安全性-碰撞
- 唯一性-终身唯一无法修改