我以前可以通过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散列,听起来好像它内置了一个盐,所以我不知道如何在Node.js中创建一个。
MySQL PASSWORD()函数也消失了。我并不是真的想做一个SELECT PASSWORD(:plainTextPass)来破解我的密码,但现在这甚至不是一个选项。
发布于 2021-01-21 11:19:11
对于那些在搜索信息时碰巧发现这一点的人:
我们正在将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')))));
发布于 2018-06-28 08:05:20
密码散列不再仅基于明文计算。因此,密码()函数是不可能实现的。从5.5btw开始就是这样了:只需查看old_passwords系统变量即可。从8.0开始,我们决定让身份验证插件进行散列,并向身份验证插件API添加了新方法。理论上,我可以创建一个新的密码函数,它需要额外的参数(身份验证方法、用户名、明文密码等)并调用相关插件。
但是不管怎么说,所有这些结果都存储在mysql.user.authentication_string中。并且总是可以通过CREATE用户传递回MySQL .与..。作为..。语法。
因此,您需要的解决方法是执行CREATE,然后显示CREATE (最后删除USER )。
如果您还想要密码函数的一个变体,请在bugs.mysql.com中提交一个特性请求。我们也接受代码贡献:)
使用的哈希本身也不是火箭科学。我相信8.0的新的默认身份验证方法(caching_sha256)是在这里定义的:定义。
因此,如果不想往返到服务器,可以使用上面的定义。
发布于 2018-06-19 15:20:03
不知道我是否理解这个问题。MySQL将使用这些身份验证插件之一对您提供的任何内容进行散列(它在幕后实现了一些特定的散列策略)。
如果您想要在应用程序级别执行额外的散列,这取决于您,但应该不会成为一个问题,因为应用程序总是要对这个附加散列进行解释。
您可能需要担心的是确保您正在使用的客户端支持该身份验证插件。
例如,两个最流行的社区驱动的mysql 驱动程序 for Node.js (我认为这是您的环境)中没有一个支持MySQL 8.0使用的默认身份验证插件caching_sha2_password (更多细节在这个回答中)。
但是,连接mysql_native_password帐户(这似乎是您的情况)不应该是一个问题。
https://stackoverflow.com/questions/50914611
复制相似问题