Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 哈希后不能使用原始密码(pgcrypto)_Node.js_Postgresql - Fatal编程技术网

Node.js 哈希后不能使用原始密码(pgcrypto)

Node.js 哈希后不能使用原始密码(pgcrypto),node.js,postgresql,Node.js,Postgresql,我已经成功地为我的管理员用户哈希了我的密码,问题是现在我不能再使用原始密码登录(没有错误,除了对无效密码的正确响应)。我可以选择用户表,只需从PGadmin(使用PostgreSQL)复制哈希密码。我真的不知道从这里到哪里去。 1.我想我必须让我的登录表单识别散列密码,并以某种方式将其与原始密码匹配。 2.想一想如何在肉馅里加盐和胡椒 我不是在寻找确切的解决方案,但可能需要一些进一步的提示:) 代码 正如在评论中提到的,不要再使用MD5了,因为它早就被弃用了 另一件事是散列与加密不同。你不能像使

我已经成功地为我的管理员用户哈希了我的密码,问题是现在我不能再使用原始密码登录(没有错误,除了对无效密码的正确响应)。我可以选择用户表,只需从PGadmin(使用PostgreSQL)复制哈希密码。我真的不知道从这里到哪里去。 1.我想我必须让我的登录表单识别散列密码,并以某种方式将其与原始密码匹配。 2.想一想如何在肉馅里加盐和胡椒 我不是在寻找确切的解决方案,但可能需要一些进一步的提示:) 代码


正如在评论中提到的,不要再使用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';