Login 最好检查用户名和密码,还是只检查用户名?

Login 最好检查用户名和密码,还是只检查用户名?,login,passwords,while-loop,Login,Passwords,While Loop,当用户尝试登录时,有两种方法可以检查用户是否有效 方法1:执行以下查询并检查返回的行数是否与1相同 SELECT * FROM users WHERE username = $_POST['username'] AND password = md5($_POST['password']) 方法2:执行查询,然后检查密码是否匹配 SELECT * FROM users WHERE username = $_POST['username'] while ($row = mysqli_fetch_

当用户尝试登录时,有两种方法可以检查用户是否有效

方法1:执行以下查询并检查返回的行数是否与1相同

SELECT * FROM users WHERE username = $_POST['username'] AND password = md5($_POST['password'])
方法2:执行查询,然后检查密码是否匹配

SELECT * FROM users WHERE username = $_POST['username']

while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)){
   if($row['password'] == md5($_POST['password'])) $logged_in = TRUE;
}

这些方法中有一种比另一种更受欢迎吗?如果是,原因是什么?

使用钥匙、盐和密码<代码>md5不安全

在服务器上,存储一个密钥:

$key = 'fPu6AY;h0-5Q>cIel,@n2$gickGs9{ys~+DT,v|Mz-]~EU3tuj18|~Ch#1_$)fGR';
当用户注册并与加密密码一起存储在服务器上时,将生成唯一的salt:

| SALT | PASSWORD | --------------------------------------------------------------------------------- | jAcTgi~4(Z | 877236d15a7b7a1f36febc49e58b142d70d72cf7d6e54dcfb252d7cde6b62a2d |
然后必须使用方法2获取salt和哈希,并将其与数据库密码进行比较。

使用密钥、salt和密码<代码>md5不安全

在服务器上,存储一个密钥:

$key = 'fPu6AY;h0-5Q>cIel,@n2$gickGs9{ys~+DT,v|Mz-]~EU3tuj18|~Ch#1_$)fGR';
当用户注册并与加密密码一起存储在服务器上时,将生成唯一的salt:

| SALT | PASSWORD | --------------------------------------------------------------------------------- | jAcTgi~4(Z | 877236d15a7b7a1f36febc49e58b142d70d72cf7d6e54dcfb252d7cde6b62a2d |
然后,您必须使用方法2获取salt并将其与数据库密码进行比较。

方法2是首选方法,因为您可以使用PHPass之类的库。它还让您能够告诉用户他们键入的用户名无效,而不是让他们猜测他们是否键入错误。Aarolama关于md5不安全的说法是正确的。不幸的是,SHA系列也不是。这两种都是文件哈希,用于唯一地标记和标识文件。使用加密散列来保护密码,就像河豚一样。PHPass为您处理许多安全性问题。盐应该是随机生成的,并且对每个用户都是唯一的,获得盐供您自己使用的唯一方法是通过第二种方法。

方法2是首选方法,因为您可以使用PHPass之类的库。它还让您能够告诉用户他们键入的用户名无效,而不是让他们猜测他们是否键入错误。Aarolama关于md5不安全的说法是正确的。不幸的是,SHA系列也不是。这两种都是文件哈希,用于唯一地标记和标识文件。使用加密散列来保护密码,就像河豚一样。PHPass为您处理许多安全性问题。SALT应该是随机生成的,并且对每个用户都是唯一的,获得它们供您自己使用的唯一方法是通过第二种方法。

要添加到FreshPrinceOfSO的答案中,不要简单地将密钥与SALT明文连接起来,而是使用HMAC方法:

$hash=hash_hmac('sha256',$saltFromDb.$userPassword,$keyFromServer);
有关HMAC的更多详细信息,请参见和,并解释为什么这个微不足道的方法存在缺陷。还值得注意的是,HMAC受冲突的影响远远小于其底层散列算法,即。E尽管核心算法和输出大小相同,但它们更安全

顺便说一下,关于输出大小。在上述RFC 2104的第5节中,指出截断的哈希(原始大小的一半或更大)在减少可能值的总数的同时,使攻击者更难通过暴力恢复明文,因为要检查的完整哈希值变得不可用。这也适用于非HMAC哈希。

要添加到FreshPrinceOfSO的答案中,不要简单地将密钥与盐渍明文连接起来,而是使用HMAC方法:

$hash=hash_hmac('sha256',$saltFromDb.$userPassword,$keyFromServer);
有关HMAC的更多详细信息,请参见和,并解释为什么这个微不足道的方法存在缺陷。还值得注意的是,HMAC受冲突的影响远远小于其底层散列算法,即。E尽管核心算法和输出大小相同,但它们更安全


顺便说一下,关于输出大小。在上述RFC 2104的第5节中,指出截断的哈希(原始大小的一半或更大)在减少可能值的总数的同时,使攻击者更难通过暴力恢复明文,因为要检查的完整哈希值变得不可用。这也适用于非HMAC哈希。

但是假设我使用一个键,哈希和salt,方法1或方法2更可取吗?你需要使用方法2来获取salt。但是我不能仍然使用方法1,例如.“其中username=$\u POST['username']和password=hashed\u salt\u password($\u POST['password'])”,这个函数在哪里为我工作?hash_salt_password($password)可以是一个salt和hash我的密码的函数…啊,对不起,你是说每个用户都应该有自己的salt?但是假设我使用一个键,hash和salt,方法1或方法2更可取吗?你需要使用方法2来取盐。但我不能。我仍然使用方法1,例如:“其中username=$\u POST['username']和password=hashd\u salted\u password($\u POST['password']),该函数在哪里为我工作?hashd\u salted\u password($password)可能是一个同时对我的密码进行salt和哈希运算的函数…啊,对不起-你是说每个用户都应该有自己的salt?