我尝试哈希密码,crypto
我无法将它们保存在数据库中.
我有node.js 4.2.3 express 4.13.3,我的数据库是PostgreSQL 9.1.该字段是character varying (255)
并且被命名pswrd
.
这是我的代码:
var tobi = new User({ usrnm:'sp', pswrd:'an' }); module.exports = User; function User(obj){ for(var key in obj){ this[key] = obj[key]; } } User.prototype.save = function (fn){ var user=this; //EDIT, added this : var psw ; var salt = crypto.randomBytes(50).toString('base64'); crypto.pbkdf2(user.pswrd, salt, 10000, 150, 'sha512',function(err, derivedKey) { //user.pswrd = derivedKey.toString('hex'); //EDIT, added this: var justCrypted = derivedKey.toString('hex'); }); var query=client.query('INSERT INTO mytable(usrnm,pswrd)VALUES($1,$2) RETURNING mytable_id',[user.usrnm,user.pswrd], function(err, result) { if(err) {console.log(err)} else { var newlyCreatedId = result.rows[0].mytable_id; } }); query.on("end", function (result) {console.log(result);client.end();}); } tobi.save(function (err){ if (err)throw error; console.log("yo"); })
要运行它,我输入node lib/user
.我没有错误,但密码未正确保存.第一个值被保存,而an
不是哈希值.我在这里错过了什么?
编辑
AshleyB答案很好,但是,请帮助我理解如何将数据从内部函数(crypto.pbkdf2
)传递到其外部(User.prototype.save = function (fn)
),当内部具有预定义,固定语法(crypto.pbkdf2
)时,所以我不知道是否或如何编辑它.
如何保留代码并仍然justCrypted
返回psw
(请参阅代码编辑)?如果它是我写的一个函数,我可以使用apply
我猜,但是,crypto.pbkdf2
被预测,我不知道是否可以添加东西.
谢谢
问题在于范围,当前查询更改的user.pswrd超出了查询范围,因此它回退到顶部指定的值.
通过在'crypto.pbkdf2'
...块内移动查询,user.pswrd值将按预期工作.我已经更新了你的代码(并使salt生成异步,因为你已经使用了异步版本的pbkdf2).
var tobi = new User({ usrnm: 'sp', pswrd: 'an' }); module.exports = User; function User(obj) { for (var key in obj) { this[key] = obj[key]; } } User.prototype.save = function(fn) { var user = this; // Changed salt generation to async version // See: https://nodejs.org/api/crypto.html#crypto_crypto_randombytes_size_callback crypto.randomBytes(50, function(ex, buf) { if (ex) throw ex; salt = buf.toString('base64'); // password, salt, iterations, keylen[, digest], callback crypto.pbkdf2(user.pswrd, salt, 10000, 150, 'sha512', function(err, derivedKey) { user.pswrd = derivedKey.toString('hex'); // Moved the query within the hash function var query = client.query('INSERT INTO mytable(usrnm,pswrd)VALUES($1,$2) RETURNING mytable_id', [user.usrnm, user.pswrd], function(err, result) { if (err) { console.log(err) } else { var newlyCreatedId = result.rows[0].mytable_id; } }); query.on("end", function(result) { console.log(result); client.end(); }); }); }); } tobi.save(function(err) { if (err) throw error; console.log("yo"); })