我曾经能够通过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)
哈希我的密码,但现在这甚至不是一个选项。
答案 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)