提问者:小点点

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


我曾经能够通过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(:就像TextPass)来散列我的密码,但现在这甚至不是一个选项。


共3个答案

匿名用户

对于任何在搜索信息时碰巧发现这一点的人:

我们正在将MySQL 5.0安装首先升级到5.7,然后升级到8.0。我们依赖于mysql_native_password身份验证插件,因为这是Anable目前支持的唯一插件,而且我们所有的旧用户帐户都使用该方案进行哈希处理。我们希望我们的Anable任务具有mysql_user模块的预制哈希,包括在8.0后时代。

经过一番挖掘,我发现了这篇博文:

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

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

选择CONCAT('*',上(SHA1(UNHEX(SHA1('the_password')))));

匿名用户

密码哈希不再仅仅基于明文计算。所以密码()函数是不可能实现的。从5.5 btw开始就是这样:只需看看old_passwords系统变量。从8.0开始,我们决定让身份验证插件进行哈希运算,我们为身份验证插件API添加了新方法。理论上,我可以创建一个新的密码函数,它将采用额外的参数(身份验证方法、用户名、明文密码等)并调用相关插件。

但是所有这些的结果都存储在mysql. user中。无论如何authentication_string。并且总是可以通过CREATE USER…IDENTIFIED BY…AS…语法传递回MySQL。

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

如果您仍然想恢复PASSWORD函数的变体,请在bugs.mysql.com中提交功能请求。FYI我们也接受代码贡献:)

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

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

匿名用户

不确定我是否理解这个问题。MySQL将使用其中一个身份验证插件(它在幕后实现了一些特定的散列策略)散列您提供的任何内容。

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

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

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

但是使用mysql_native_password帐户(这似乎是您的情况)连接应该不是问题。