我正在实施经过身份验证的网络应用,而且我还有一些关于用户名和密码存储的问题。
没有可能实施任何TFA方法,我需要一些专家建议,以便我在数据库中保存散列密码和盐。
这些是我生成盐的JS函数以及我对密码进行散列的方式:
createSalt = function() {
var len = 30;
return crypto.randomBytes(Math.ceil(len * 3 / 4))
.toString('base64') // convert to base64 format
.slice(0, len) // return required number of characters
.replace(/\+/g, '0') // replace '+' with '0'
.replace(/\//g, '0'); // replace '/' with '0'
}
hashPassword = function(password, salt) {
var hash = crypto.createHash('sha256');
hash.update(password || "");
hash.update(salt || "");
return hash.digest('hex');
}
有任何评论或改进吗?
感谢您的建议。
答案 0 :(得分:1)
由于节点crypto
提供了基于密码的同步密钥派生函数2(PBKDF2)实现,您可以这样做(2个班轮):
let saltlength = 32;
let keylength = 128;
let salt = crypto.randomBytes(saltlength).toString('hex');
let key = crypto.pbkdf2Sync(password, salt, 1000, keylength, 'sha512').toString('hex');
其中1000是迭代次数......当toString(hex)
将字符串的长度加倍时,这里得到的盐长度为64,密钥长度为256 ......根据您的需要进行调整。我个人喜欢使用更长的盐长度(128)和更长的密钥长度(512)
toString('base64')
- 您使用的那个节省了一点空间......但需要一点点" afterwork"。但无论如何,我喜欢你的方法。