3

我曾经能够通过两次通过 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 中创建一个。


MySQLPASSWORD()功能也消失了。我真的不想对SELECT PASSWORD(:plainTextPass)我的密码进行哈希处理,但现在这甚至不是一个选择。

4

3 回答 3

4

密码哈希不再仅基于明文计算。所以密码()函数是不可能实现的。顺便说一句,从 5.5 开始就是这样:只需查看 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

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

于 2018-06-28T08:05:20.483 回答
3

对于在搜索信息时碰巧发现此内容的任何其他人:

我们正在将 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')))));

于 2021-01-21T11:19:11.113 回答
1

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

如果您想在应用程序级别执行额外的散列,这取决于您,但只要应用程序始终考虑该额外的散列轮次,这不应该成为问题。

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

例如,Node.js 的两个最流行的社区驱动的mysql 驱动程序(我相信这是你的环境)都没有支持caching_sha2_passwordMySQL 8.0 使用的默认身份验证插件(更多细节在这个答案中)。

但是连接一个mysql_native_password帐户(这似乎是你的情况)应该不是问题。

于 2018-06-19T15:20:03.250 回答