- PBKDF2
- bcrypt
两种方式 正在纠结选哪一种。
PBKDF2 比较灵活 可以自定义数据存储的格式 salt 与 hash 密文的组合,以及循环加密的次数,可以达到很小。
bcrypt 有个问题 各种语言的实现库 好想还有点差异,有些事以 $2a $2y 等开头的,速度最快在我这机器里面是13ms 。。
我是单机 而且访问量有点高。。
我的 pbkdf2 算法 业务封装
const crypto = require('crypto');
const PBKDF2_HASH_ALGORITHM = "sha256";
const PBKDF2_ITERATIONS = 1024;
const PBKDF2_SALT_BYTE_SIZE = 24;
const PBKDF2_HASH_BYTE_SIZE = 24;
const HASH_SECTIONS = 4;
const HASH_ALGORITHM_INDEX = 0;
const HASH_ITERATION_INDEX = 1;
const HASH_SALT_INDEX = 2;
const HASH_PBKDF2_INDEX = 3;
function create_hash(password, cb) {
crypto.randomBytes(PBKDF2_SALT_BYTE_SIZE, (err, buf) => {
if (err) {
return cb(err);
}
let _salt = buf.toString('base64');
crypto.pbkdf2(String(password), _salt, PBKDF2_ITERATIONS, PBKDF2_HASH_BYTE_SIZE, PBKDF2_HASH_ALGORITHM, (err, derivedKey) => {
if(err) {
return cb(err);
}
// format: algorithm:iterations:salt:hash
let real_password = PBKDF2_HASH_ALGORITHM + ':' + PBKDF2_ITERATIONS + ':' + _salt + ':' + derivedKey.toString('base64');
return cb(null, real_password);
});
});
}
function validate_password(password, correct_hash, cb) {
let params = correct_hash.split(':');
if(params.length < HASH_SECTIONS) {
return cb(null , false);
}
let pbkdf2 = new Buffer(params[HASH_PBKDF2_INDEX], 'base64');
crypto.pbkdf2(String(password), params[HASH_SALT_INDEX], Number(params[HASH_ITERATION_INDEX]), pbkdf2.length, params[HASH_ALGORITHM_INDEX], (err, _derivedKey) => {
if(err) {
return (err);
}
return cb(null, _slow_equals(pbkdf2, _derivedKey));
});
}
/**
* Slow compare two strings
*
* @param {Buffer} a
* @param {Buffer} b
* @return {Boolean}
*/
function _slow_equals(a, b) {
var diff = a.length ^ b.length;
for(var i = 0; i < a.length && i < b.length; i++){
diff |= a[i] ^ b[i];
}
return diff === 0;
}
module.exports = {
create_hash,
validate_password
};
為什麼要加密?你要在網路里傳輸密碼嗎?
@captainblue2013 数据库里面的密码不加密不是很危险么!
@ipengyo 数据库里密码加密了那还有什么价值。。。。。。
@ipengyo 那个叫加密?能解密吗?
直接md5啊
@jiangzhuo 明文加密。。
@shuaishenk 直接MD5未免太粗暴。
@captainblue2013 可以 需要拿用户的密码来解密。。能匹配上就OK
@ipengyo 你到底明不明白密碼做hash的意義在哪?還解密?
@captainblue2013 防止明文密码泄漏啊,就这么简单。。
非对称加密,靠谱一点嘛
@mlyknown 嗯 上面所述的两个算法都是非对称算法。
前端对称加密和不加密的区别仅仅是隐私没那么容易暴露。非对称加密还不如 https,浪费的时间可不止 https 证书那点银子吧
用灵活的,随时可以自己更改的那种
来自酷炫的 CNodeMD
@DevinXian 后端明文密码加密好像跟https 一点关系都没哦。。。。。
@a69694510 嗯 是的。
@ipengyo 后端当然跟https没关系啦,我说的非对称加密指的是前端- -