如何在外部为MySQL创建密码哈希?

时间:2018-06-18 17:23:11

标签: mysql node.js mysql-8.0

我曾经能够通过sha1两次运行我的密码来创建与MySQL兼容的密码,但看起来这在MySQL 8中不起作用。

MySQL似乎现在使用这些密码插件。因此语法(在JS中):

const createUserSql = `CREATE USER ${db.escapeValue(agency.login)} IDENTIFIED WITH mysql_native_password BY ${db.escapeValue(passwordHash)};`;

我想在Node.js中创建可与MySQL一起使用的密码。我知道我可以使用纯文本密码并让MySQL散列它们,但是我将这个SQL打印到终端并且我不希望密码可见,所以我想预先散列它们。

什么算法适用于MySQL 8?我愿意使用任何内置的密码插件。

sha256_password听起来不错,但我不认为这是一个直接的sha256哈希,听起来它有一个内置的盐,所以我不知道如何在Node.js中创建一个。

MySQL PASSWORD()功能也消失了。我真的不想用SELECT PASSWORD(:plainTextPass)哈希我的密码,但现在这甚至不是一个选项。

3 个答案:

答案 0 :(得分:3)

不再仅基于明文来计算密码哈希。因此,password()函数无法实现。从5.5 btw开始就是这样:只需查看old_passwords系统变量即可。 从8.0开始,我们决定让身份验证插件进行哈希处理,并向身份验证插件API添加了新方法。 从理论上讲,我可以制作一个新的密码函数,该函数将使用额外的参数(身份验证方法,用户名,明文密码等)并调用相关的插件。

但是所有的结果仍然存储在mysql.user.authentication_string中。 并且始终可以通过CREATE USER ... IDENTIFIED WITH ... AS ...语法传递回MySQL。

因此,您需要执行的解决方法是执行CREATE USER,然后执行SHOW CREATE USER(最终将DROP USER)。

如果您仍然希望返回PASSWORD函数的变体,请在bugs.mysql.com中提出功能请求。 仅供参考,我们也接受代码贡献:)

本身使用的哈希也不是火箭科学。我相信,对于8.0的新默认身份验证方法(caching_sha256),它在此处定义:https://dev.mysql.com/doc/dev/mysql-server/latest/page_caching_sha2_authentication_exchanges.html#sect_caching_sha2_definition

因此,如果您不想往返于服务器,则可以使用上面的定义。

答案 1 :(得分:2)

致在搜索信息时碰巧发现此信息的任何其他人:

我们正在将 MySQL 5.0 安装先升级到 5.7,然后再升级到 8.0。我们依赖 mysql_native_password 身份验证插件,因为这是 Ansible 当前唯一支持的插件,而且我们所有的旧用户帐户都具有该方案的哈希值。我们希望我们的 Ansible 任务为 mysql_user 模块预先制作哈希,包括在我们到达那里后的 8.0 时代。

经过一番挖掘,我找到了这篇博文:

https://blog.pythian.com/hashing-algorithm-in-mysql-password-2/

PASSWORD() 函数在 MySQL 8 中消失了,但它看起来像返回完全等效的值:

SELECT CONCAT('*', UPPER(SHA1(UNHEX(SHA1('the_password')))));

答案 2 :(得分:0)

不确定我是否理解问题。 MySQL将使用这些身份验证插件之一(您自己在幕后实现一些特定的哈希策略)对您提供的任何内容进行哈希处理。

如果您希望在应用程序级别执行其他哈希处理,这取决于您,但是只要应用程序始终考虑该额外哈希处理,就不成问题。

您可能需要担心的事情是确保您使用的客户端支持该身份验证插件。

例如,Node.js(我相信是您的环境)中两个最受欢迎的社区驱动的mysql drivers均不支持默认身份验证插件-{{1 }}-由MySQL 8.0使用(此answer中有更多详细信息)。

但是与caching_sha2_password帐户建立连接(这似乎是您的情况)应该不是问题。