用户登录使用单个查询和每用户密码盐(User Login with a single query a

2019-08-16 20:32发布

我已经决定要实现使用每个用户的盐,存储在数据库中的用户登录。 该盐被前缀到该散列与SHA和存储在DATABSE密码。

在当我不使用盐过去,我将使用计数通过使用用户输入的用户名和密码查询返回的行的数目的典型方法。 随着每个用户盐但是,你需要得到盐,然后才能与存储的密码哈希进行比较。

因此,为了避免两个查询(1,得到盐和另一验证输入凭据),我决定得到盐以及基于所输入的用户名单个查询哈希密码。 就像是

SELECT users.salt, users.password
        FROM users   
        WHERE username = ?'

然后在服务器端代码(PHP)我连接具有输入密码的盐,哈希,并将其与已经从数据库中获取的密码进行比较。

如果说不清楚,我想最关键的区别是,在后一种方法,我检查PHP凭证wheras在此之前数据库已完成。

此法有什么缺点,在安全性方面或以其他方式

Answer 1:

你可以在这样一个查询做到这一点:

SELECT 
   SHA1(CONCAT(users.salt, "password-input")) = users.passwordhash
WHERE 
   username = "username-input"


Answer 2:

而哪些是“在服务器端代码(PHP)”的服务器? 我来自一个世界里,DBMS服务器与其他一切都是客户端。 我怀疑你正在寻找一个web服务器作为“服务器端”和DBMS作为一个单独的小发明,不一定作为服务器本身。 不错啊,这样是观点的相对论。 (不要让我开始对X11服务器VS客户端!)

对,这是合理的简单地收集该盐并在单个操作中的用户名的盐腌,哈希密码,然后生成所提供的密码和PHP中的盐,它与所检索的散列密码值相比较的SHA结果。 它甚至意味着密码不从PHP到数据库服务器旅行,所以如果通信是否被加密(在PHP和数据库管理系统是不一样的机器上的情况),也没关系。 它也分担了DBMS到PHP计算; 这是否是一个利益依赖于PHP和数据库管理系统的相对工作量。

作为另一个答案指出,可以通过发送用户提供的密码给DBMS和具有DBMS做哈希计算得到的答案。 简单地引用了用户的输入当心-逃避它,以防止SQL注入。 这可能暴露密码从PHP到DBMS的行程窥探。 这有多重要取决于您的基础架构。



Answer 3:

I think your approach is generally sound. More important than how many queries you use, is whether you are retrieving the valid database password over the wire even when a bad password is input by the user. Your query does this, whereas by making use of an encryption function on your db server, you are avoiding this and making things more secure.

To make it even more secure, use a stored procedure or function that hides the type of encryption (or the fact that any is even being used) from anyone who is sniffing SQL queries over the wire, or through some other means (e.g., causing queries to be visible by using SQL injection vulnerabilities, or by exposing the query in an error message).



Answer 4:

我看它没有缺点。 “gahooa”给了一个很好的答案为好。 它会从你的Web服务器的处理成本转移到你的数据库服务器,但是这只是给你一个问题,哪一个更适合的负载。



文章来源: User Login with a single query and per-user password salt