密碼安全
密碼的作用---證明是你
密碼的存儲
密碼的傳輸
密碼的替代方案
生物特征密碼的問題
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CNiBDMkdzYzIGOwEmYmVWOyU2N0IGM1IjZxE2MkFWZx8CX0IzLcRDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL0M3Lc9CX6MHc0RHaiojIsJye.png)
密碼-洩露管道
- 資料庫被偷
- 伺服器被入侵
- 通訊被竊聽
- 内部人員洩露資料庫
- 其它網站(撞庫)
密碼-存儲
- 嚴禁明文存儲(防洩漏)
- 單向變換(防洩漏)
- 變換複雜度要求(防猜解)
- 密碼複雜度要求(防猜解)
- 加鹽(防猜解)
密碼-雜湊演算法
- 明文-密文---一一對應
- 雪崩效應
- 密文明文 無法反推
- 密文固定長度
- 常見雜湊演算法: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 傳輸
- 頻率限制
- 前端加密意義有限
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("密碼不正确");
}
生物特征密碼
- 指紋(唇紋)
- 聲紋
- 虹膜
- 人臉
- 私密性-容易洩露
- 安全性-碰撞
- 唯一性-終身唯一無法修改