mysql 8.0版中的hash()函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 8.0版中的hash()函数相关的知识,希望对你有一定的参考价值。

我正在尝试将密码存储在我的用户表中。当然,我想先加盐并哈希。

但是mysql中没有hash()方法了。我怎么能在8.0版本中做到这一点?还有替代品吗?

在此先感谢您的帮助。

答案

在将密码发送到SQL之前,您应该在应用程序中哈希密码。

我为什么这么说?毕竟你可以这样做:

INSERT INTO Accounts (user, salt, password) 
VALUES ('myuser', '1234', SHA2(CONCAT('xyzzy', '1234'), 256))

但现在您的密码'xyzzy'在查询日志和二进制日志中以纯文本形式出现,即使它以散列形式存储在表本身中。如果你没有充分保护你的日志,黑客可以抓住他们并找到每个人的密码。

而是在应用程序代码中执行哈希操作。获取结果,并将哈希字符串逐字保存在数据库中。

INSERT INTO Accounts (user, salt, password) 
VALUES ('myuser', '1234', 'd3822b5f03ad0c1a363d874238f6b48fd68a131cc35d5e55c77a81db1d266b84')

这样就不会记录纯文本密码。

同样,当您在用户登录时对其进行密码检查时,请读取salt,然后使用它来散列输入的密码,然后将其与存储在数据库中的哈希字符串进行比较。

SELECT salt FROM Accounts WHERE user = ?

...calculate hash string using user input + salt...

SELECT password = ? AS password_matches FROM Accounts WHERE user = ?

以上是关于mysql 8.0版中的hash()函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 8.0 版中使用 `target: "serverless"` 使用 Next.js 正确实现无服务器 s-s-r

在保持相同行为的同时隐藏 url 中的 #hash 片段?

MySQL 8.0 新增SQL语法对窗口函数和CTE的支持

MySQL中的分区HASH分区

如何理解这段代码片段中的两对括号?

[翻译] C# 8.0 接口默认实现