我正在尝试验证用户登录是否将输入密码与用户输入的密码相匹配
我的插入查询:
insert into login (Emp_id, Emp_Fname, Emp_Lname, Username, Password) values (5, 'TestFName', 'TestLName', 'Test', password('april'));
它将密码存储为以下值:
*72B46CDA233C759A88BEF81F59F66D78B26B2848
select * from login where password = '*72B46CDA233C759A88BEF81F59F66D78B26B2848'; -- this line shows me the result
select password('april'); -- this returns *72B46CDA233C759A88BEF81F59F66D78B26B2848
select * from login where password = 'password(april)'; -- this returns an empty set
这行代码还有其他替代方法吗?
我认为你需要使用:
select * from login where password = password('april');
所以,不要引用整个
password
函数,只引用函数的参数。
无法用纯SQL命令安全地存储密码,而应该使用开发语言专用的密码哈希函数。在 PHP 中,这将是用于验证密码的函数 password_hash() 和 password_verify()。
更重要的是,MySql 的password()
函数从未打算与用户密码一起使用,并且已被弃用(将在未来版本中删除)。查看文档中的第二个注释框。 不能将哈希值留给 SQL 命令的原因是,无法在数据库中搜索加盐密码哈希值。搜索必须仅通过用户名完成,然后可以使用用户输入验证找到的密码哈希。您可以在这个
answer中找到更深入的解释。
https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_password 说:
此函数从 MySQL 5.7.6 开始已弃用,并将在未来的 MySQL 版本中删除。这不是一个无意义的警告。PASSWORD()供MySQL Server中的认证系统使用;您不应该在自己的应用程序中使用它。
https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_password 说:
该函数在 MySQL 8.0.11 中被删除。
所以不要使用 PASSWORD()
insert into login (Emp_id, Emp_Fname, Emp_Lname, Username, Password)
values (5, 'TestFName', 'TestLName', 'Test', password('april'));
我不会以这种方式使用密码(或任何其他哈希函数),因为你的 SQL 语句中仍然有明文密码。这最终会记录在查询日志和基于语句的二进制日志中,因此这是一个安全漏洞。也就是说,任何可以访问您的日志的人都可以检查密码。
相反,请在应用程序中对密码进行哈希处理,然后将该哈希结果放入 SQL 语句中。
您使用哪种哈希函数取决于您用来编写应用程序代码的语言。 @martinstoeckli 提到了 PHP 开发人员使用的几个函数,但这些函数对于其他编程语言来说并不相同。您没有提及您使用哪种语言。
同样,当您搜索具有该密码的登录名时,如果您搜索特定的哈希字符串,它会起作用,但这不起作用:
select * from login where password = 'password(april)'; -- this returns an empty set
原因是您正在搜索
字符串“密码(四月)”。将表达式放在引号中意味着使用该文字字符串 - 它不会执行该函数并使用它的结果。
再次强调,无论如何你都不想使用 SQL 来计算哈希值。这会将明文密码放入查询日志中,不利于安全。您希望在应用程序中生成哈希字符串,然后在搜索中使用哈希字符串,就像您的第一个示例一样。
但不使用 PASSWORD() 函数 — 使用某些应用程序代码函数。
select * from login where password = '*72B46CDA233C759A88BEF81F59F66D78B26B2848';
(上面的哈希字符串基于您的示例。它是由 MySQL 的 PASSWORD() 函数生成的哈希,仅与 SHA1 哈希一样强大,已知它不适合密码。)
select password from login where user = 'billkarwin'
然后在应用程序代码中,将从数据库获取的哈希字符串与根据用户尝试登录时的输入重新计算的哈希字符串进行比较。