我正在尝试在我的用户表中存储密码。我当然想先把它们撒上盐再炒。但是mysql中已经没有hash()方法了。如何在8.0版中执行此操作?有其他选择吗?事先谢谢你的帮助。
wrrgggsh1#
在将密码发送到sql之前,应该先在应用程序中散列密码。我为什么这么说?毕竟你可以这么做:
INSERT INTO Accounts (user, salt, password) VALUES ('myuser', '1234', SHA2(CONCAT('xyzzy', '1234'), 256))
但是现在您可以在查询日志和二进制日志中以纯文本形式显示密码“xyzy”,即使它是以哈希形式存储在表本身中。如果你没有充分保护你的日志,黑客可能会抓住他们,找到每个人的密码。相反,在应用程序代码中执行哈希操作。获取结果,并将哈希字符串逐字保存在数据库中。
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 = ?
1条答案
按热度按时间wrrgggsh1#
在将密码发送到sql之前,应该先在应用程序中散列密码。
我为什么这么说?毕竟你可以这么做:
但是现在您可以在查询日志和二进制日志中以纯文本形式显示密码“xyzy”,即使它是以哈希形式存储在表本身中。如果你没有充分保护你的日志,黑客可能会抓住他们,找到每个人的密码。
相反,在应用程序代码中执行哈希操作。获取结果,并将哈希字符串逐字保存在数据库中。
这样就不会记录纯文本密码。
同样,当您在用户登录时对其进行密码检查时,读取salt,然后使用它对他们输入的密码进行哈希运算,然后将其与存储在数据库中的哈希字符串进行比较。