如何在外部为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中创建一个.
MySQL PASSWORD()函数也消失了.我真的不想做一个SELECT PASSWORD(:plainTextPass)来哈希我的密码,但现在这甚至不是一个选项.
解决方法:
密码哈希不再仅基于明文计算.因此无法实现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
因此,如果您不想对服务器进行往返,则可以使用上述定义.
标签:mysql,node-js,mysql-8-0 来源: https://codeday.me/bug/20190910/1800755.html