用户密码加密 算法选择。?
发布于 7 年前 作者 ipengyo 6717 次浏览 来自 问答
  • PBKDF2
  • bcrypt

两种方式 正在纠结选哪一种。

PBKDF2 比较灵活 可以自定义数据存储的格式 salt 与 hash 密文的组合,以及循环加密的次数,可以达到很小。

bcrypt 有个问题 各种语言的实现库 好想还有点差异,有些事以 $2a $2y 等开头的,速度最快在我这机器里面是13ms 。。

我是单机 而且访问量有点高。。

18 回复

我的 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 那个叫加密?能解密吗?

@jiangzhuo 明文加密。。

@shuaishenk 直接MD5未免太粗暴。

@captainblue2013 可以 需要拿用户的密码来解密。。能匹配上就OK

@ipengyo 你到底明不明白密碼做hash的意義在哪?還解密?

@captainblue2013 防止明文密码泄漏啊,就这么简单。。

非对称加密,靠谱一点嘛

@mlyknown 嗯 上面所述的两个算法都是非对称算法。

前端对称加密和不加密的区别仅仅是隐私没那么容易暴露。非对称加密还不如 https,浪费的时间可不止 https 证书那点银子吧

用灵活的,随时可以自己更改的那种

来自酷炫的 CNodeMD

@DevinXian 后端明文密码加密好像跟https 一点关系都没哦。。。。。

@a69694510 嗯 是的。

@ipengyo 后端当然跟https没关系啦,我说的非对称加密指的是前端- -

回到顶部