mpe*_*pen 4 mysql node.js mysql-8.0
我曾经能够通过 sha1 运行密码两次来创建与 MySQL 兼容的密码,但似乎这在 MySQL 8 中不起作用。
MySQL现在似乎使用这些密码插件。语法如下(在 JS 中):
const createUserSql = `CREATE USER ${db.escapeValue(agency.login)} IDENTIFIED WITH mysql_native_password BY ${db.escapeValue(passwordHash)};`;
Run Code Online (Sandbox Code Playgroud)
我想在 Node.js 中创建可与 MySQL 一起使用的密码。我知道我可以只使用纯文本密码并让 MySQL 对它们进行哈希处理,但我将此 SQL 打印到终端,并且我不希望密码可见,因此我想对它们进行预哈希处理。
什么算法适用于 MySQL 8?我愿意使用任何内置密码插件。
sha256_password听起来不错,但我不认为它是一个直接的 sha256 哈希,听起来它内置了一个盐,所以我不确定如何在 Node.js 中创建一个。
MySQL的PASSWORD()功能也没有了。我真的不想对SELECT PASSWORD(:plainTextPass)我的密码进行哈希处理,但现在这甚至不是一个选择。
对于在搜索信息时碰巧发现此内容的其他人:
我们正在将 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')))));
小智 5
密码哈希值不再仅根据明文计算。所以password()函数是不可能实现的。顺便说一句,从 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
因此,如果您不想与服务器进行往返,则可以使用上面的定义。
| 归档时间: |
|
| 查看次数: |
5620 次 |
| 最近记录: |