【问题标题】:Querying password hash from mysql database returns buffer array of decimal numbers instead of string从 mysql 数据库查询密码哈希返回十进制数字的缓冲区数组而不是字符串
【发布时间】:2019-12-31 22:09:34
【问题描述】:

我正在使用 Node.js 和 MySql 开发一个 API。

我使用bcrypt 对密码进行哈希处理,并使用VARBINARY 数据类型将其存储到MySql 数据库中。

当我通过命令行查询密码哈希时,我收到了我想要的输出。 但是,当我通过我的 API 查询时,我得到了不同的格式。 我认为是十进制格式。

如何再次获取字符串格式的哈希?

使用命令行的结果:

通过 api 获得结果

[
    {
        "pwd": {
            "type": "Buffer",
            "data": [
                36,
                50,
                98,
                36,
                49,
                48,
                36,
                71,
                46,
                107,
                74,
                75,
                55,
                110,
                54,
                49,
                70,
                77,
                120,
                112,
                121,
                52,
                103,
                73,
                78,
                83,
                81,
                79,
                101,
                98,
                57,
                105,
                89,
                48,
                105,
                86,
                113,
                86,
                81,
                113,
                114,
                104,
                69,
                84,
                78,
                103,
                117,
                105,
                65,
                53,
                102,
                83,
                115,
                115,
                54,
                53,
                100,
                57,
                112,
                121
            ]
        }
    }
]

代码:

app.post("/login", (req, res) => {
    db.query(
        `select pwd from users where username='${req.body.username}';`,
        (err, results, fields) => {
            if (err) throw err;
            console.log(results);
            return res.json(results);
        }
    );
});

【问题讨论】:

  • 警告:请务必使用带有占位符值的准备好的语句来提供查询和数据之间的清晰分离,这样您就可以避免SQL injection bugs。这由 Sequelize 支持。在这里你应该有username=?。此外,; 仅用于交互模式,应在此类查询中省略。
  • 您可能需要将 pwd 转换为 varchar,例如 SELECT CAST(pwd AS VARCHAR) AS password ...

标签: mysql node.js express hash


【解决方案1】:

您将获得一个 Buffer,因为这是 VARBINARY 列的最佳表示。如果你想转换你可以调用toString()来获取一个字符串。

您真正想要的是 VARCHAR 列,因为 Bcrypt 输出将始终是简单的 ASCII,不需要二进制类型的列。

【讨论】:

    猜你喜欢
    • 2021-08-12
    • 2021-12-30
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    相关资源
    最近更新 更多