我已经决定使用存储在数据库中的每个用户盐来实现用户登录。盐的前缀是用SHA加密并存储在数据库中的密码。用户使用单个查询和每个用户的密码salt登录
在过去,当我没有使用盐时,我会使用用户输入的用户名和密码来查询返回的行数的典型方法。然而,对于每个用户salt,您需要先获得salt,然后才能将其与存储的密码哈希进行比较。
因此,为了避免有两个查询(1来获取盐和另一个来验证输入凭据),我决定根据输入的用户名在单个查询中得到salt和散列密码。像
SELECT users.salt, users.password
FROM users
WHERE username = ?'
和东西然后在服务器端代码(PHP)我连接具有输入密码的盐,哈希,并将其与已经从数据库中获取的密码进行比较。
如果不清楚,我猜测主要的区别在于,在后一种方法中,我正在检查PHP数据库中的凭据。
是否有这个方法的什么缺点,在安全性方面或以其他方式
记住要适当地逃避用户输入以防止SQL注入。正如我的答案中指出的那样 - 它在PHP和DBMS之间发送密码;如果DBMS与PHP代码不在同一台机器上,这可能会暴露密码以进行侦听。它还使用SHA计算而不是PHP加载DBMS。是否重要取决于PHP和DBMS的相对工作量。 –
我确实考虑过MySQL服务器和PHP之间的数据流。我是否正确地认为,如果你不能相信与数据库的连接的“安全性”,那么你的问题就更大了? – gahooa
谢谢,非常优雅 – zenna