Node.js 哈希后不能使用原始密码(pgcrypto)
我已经成功地为我的管理员用户哈希了我的密码,问题是现在我不能再使用原始密码登录(没有错误,除了对无效密码的正确响应)。我可以选择用户表,只需从PGadmin(使用PostgreSQL)复制哈希密码。我真的不知道从这里到哪里去。 1.我想我必须让我的登录表单识别散列密码,并以某种方式将其与原始密码匹配。 2.想一想如何在肉馅里加盐和胡椒 我不是在寻找确切的解决方案,但可能需要一些进一步的提示:) 代码Node.js 哈希后不能使用原始密码(pgcrypto),node.js,postgresql,Node.js,Postgresql,我已经成功地为我的管理员用户哈希了我的密码,问题是现在我不能再使用原始密码登录(没有错误,除了对无效密码的正确响应)。我可以选择用户表,只需从PGadmin(使用PostgreSQL)复制哈希密码。我真的不知道从这里到哪里去。 1.我想我必须让我的登录表单识别散列密码,并以某种方式将其与原始密码匹配。 2.想一想如何在肉馅里加盐和胡椒 我不是在寻找确切的解决方案,但可能需要一些进一步的提示:) 代码 正如在评论中提到的,不要再使用MD5了,因为它早就被弃用了 另一件事是散列与加密不同。你不能像使
正如在评论中提到的,不要再使用MD5了,因为它早就被弃用了 另一件事是散列与加密不同。你不能像使用密码那样对散列进行
解密
应该做的是通过散列算法运行明文,然后查看它是否与开始时计算的原始散列匹配
对于Node.js,有一些很好的库,比如bcrypt
,可以用来简化流程,或许可以使其更安全
如果您坚持执行自己的验证程序,则应如下所示:
从登录表单获取用户的密码
通过您选择的哈希算法运行它(请不要使用MD5)
在数据库中查询哈希密码
比较登录表单中的哈希密码是否与数据库中的密码相同
正如在评论中提到的,不要再使用MD5了,因为它早就被弃用了
另一件事是散列与加密不同。你不能像使用密码那样对散列进行解密
应该做的是通过散列算法运行明文,然后查看它是否与开始时计算的原始散列匹配
对于Node.js,有一些很好的库,比如bcrypt
,可以用来简化流程,或许可以使其更安全
如果您坚持执行自己的验证程序,则应如下所示:
从登录表单获取用户的密码
通过您选择的哈希算法运行它(请不要使用MD5)
在数据库中查询哈希密码
比较登录表单中的哈希密码是否与数据库中的密码相同
例如,您需要类似这样的内容(重命名表和列以匹配您的示例):
插入时存储在users.password中的值是算法、salt以及使用该算法和salt散列实际密码的结果的组合。现在将users.password再次传递到crypt中,以便它可以从中提取算法和salt。然后,它使用该算法和salt重新计算所谓密码的散列。如果重新计算的值与存储的值匹配,则声称的密码是正确的。As,您需要类似的内容(重命名表和列以匹配您的示例):
插入时存储在users.password中的值是算法、salt以及使用该算法和salt散列实际密码的结果的组合。现在将users.password再次传递到crypt中,以便它可以从中提取算法和salt。然后,它使用该算法和salt重新计算所谓密码的散列。如果重新计算的值与存储的值匹配,则声称的密码是正确的。注意:您不需要使用终止查询代码>以编程方式运行它们时。这仅适用于交互式SQL shell。警告:MD5完全不适合哈希密码。至少要使用一种类似于密码的可变强度哈希算法,这种算法可以抵抗暴力攻击。任何像样的Bcrypt库都会有一个简单的哈希函数和一个匹配的验证函数,用于测试为身份验证提供的密码。值得一提的是,对于Node,这是一个开始身份验证的好地方。注意:您不需要使用终止查询代码>以编程方式运行它们时。这仅适用于交互式SQL shell。警告:MD5完全不适合哈希密码。至少要使用一种类似于密码的可变强度哈希算法,这种算法可以抵抗暴力攻击。任何像样的Bcrypt库都会有一个简单的哈希函数和一个匹配的验证函数,用于测试为身份验证提供的密码。值得一提的是,对于Node来说,这是一个开始身份验证的好地方。
function createAdmin(){
var usertypeid = null;
const type = "adm";
pool.query(`INSERT INTO usertype(type) VALUES ($1) RETURNING userTypeId;`, [type], function (error, results) {
if (error){
throw error;
} else{
usertypeid = results.rows[0].usertypeid;
console.log(usertypeid);
insertAdmin();
}
});
function insertAdmin(){
pool.query(`
INSERT INTO users(
usertypeid, userName, email, password)
VALUES($1, 'admin', 'admin@admin.com', CRYPT('admin', GEN_SALT('md5')));`, [usertypeid]);
}
}
SELECT (password = crypt('entered password', password)) AS pswmatch FROM users where username='admin';