【问题标题】:hash() function in mysql version 8.0mysql 8.0 版中的 hash() 函数
【发布时间】:2019-02-21 20:51:13
【问题描述】:

我正在尝试将密码存储在我的用户表中。我当然想在之前给它们加盐和哈希。

但是 mysql 中不再有 hash() 方法了。如何在 8.0 版中做到这一点?有替代品吗?

提前感谢您的帮助。

【问题讨论】:

  • 警告:编写自己的访问控制层并不容易,而且有很多机会会严重错误。当任何现代的development framework(如Laravel)带有强大的authentication system 内置时,请不要编写自己的身份验证系统。至少遵循recommended security best practices 并且永远不要将密码存储为纯文本 或像 SHA1 或 MD5 这样的弱散列。
  • 请包含 exact 错误消息,而不是其近似值。 MySQL 没有通用的HASH() 函数。您可能会将其与 HASH() partitioning method 混淆。
  • 除了没有hash-function,MySQL 8.0.11+ 也没有password()-function。

标签: mysql hash passwords


【解决方案1】:

在将密码发送到 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 = ?

【讨论】:

    猜你喜欢
    • 2020-01-23
    • 2018-07-03
    • 2021-02-12
    • 2019-11-24
    • 2019-12-20
    • 1970-01-01
    • 2018-12-28
    • 2019-04-14
    • 1970-01-01
    相关资源
    最近更新 更多