node.js 加密

  cheney

如果不是密码专家,任何时候都不应该自己写加密算法,何况是 node.js 。node 内置了加密相关的库,是用 require('crypto') 载入。Crypto 依赖 OpenSSL 库。

hash

hash 用于数据的不可逆加密。crypto.getHashes()可以查看当前支持的所有算法。

调用方法:
crypto.createHash(algorithm).update(data).digest(encoding='binary')

  • algorithm
    可选 ‘sha1’, ‘md5’, ‘sha256’, ‘sha512’

  • encoding
    可选 ‘hex’, ‘binary’ ,‘base64’

可逆加密

使用 crypto.getCiphers() 查看所有支持的可逆加密,其中 aes/des等对称算法,不支持非对称算法rsa,如果要用 rsa 需要另外的扩展库 jsRSA

//加密
function cipher(algorithm, key, buf ,cb){
    var encrypted = "";
    var cip = crypto.createCipher(algorithm, key);
    encrypted += cip.update(buf, 'binary', 'hex');
    encrypted += cip.final('hex');
    cb(encrypted);
}
//解密
function decipher(algorithm, key, encrypted,cb){
    var decrypted = "";
    var decipher = crypto.createDecipher(algorithm, key);
    decrypted += decipher.update(encrypted, 'hex', 'binary');
    decrypted += decipher.final('binary');
    cb(decrypted);
}

密码加密

密码加密是一件应该非常小心翼翼的事,业界最佳实践是:
1. 生成随机盐值, 2.使用 pbkdf2 做 hash

function cipherpwd(cb){
	crypto.randomBytes(128, function (err, salt) {
	    if (err) { throw err;}
	    salt = salt.toString('hex');
	    //console.log(salt); //生成salt
	
	    crypto.pbkdf2(txt, salt, 4096, 256, function (err,hash) {
	        if (err) { throw err; }
	        hash = hash.toString('hex');
	        //console.log(hash);//生成密文
	        cb(salt,hash);
	    })
	})
}

盐值和最终 hash 的值都应该保存,为了以后升级,也可以将加密轮数也导出保存。

除了生成部分,