我决定使用存储在数据库中的每用户盐来实现用户登录。盐作为密码的前缀,该密码使用 SHA 进行哈希处理并存储在数据库中。
过去,当我不使用盐时,我会使用典型的方法,使用用户输入的用户名和密码来计算查询返回的行数。然而,对于每个用户的盐,您需要先获取盐,然后才能将其与存储的密码哈希进行比较。
因此,为了避免进行两个查询(一个用于获取盐,另一个用于验证输入凭据),我决定根据输入的用户名在单个查询中获取盐和哈希密码。就像是
SELECT users.salt, users.password
FROM users
WHERE username = ?'
然后在服务器端代码(PHP)中,我将盐与输入的密码连接起来,对其进行散列并将其与已从数据库中获取的密码进行比较。
如果这还不清楚,我想关键的区别在于,在后一种方法中,我在 PHP 中检查凭据,而在数据库中完成此操作之前。
这种方法在安全性或其他方面有什么缺点吗?
您可以在一个查询中完成此操作,如下所示:
SELECT
SHA1(CONCAT(users.salt, "password-input")) = users.passwordhash
WHERE
username = "username-input"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)