Adição de salt na autenticação

Agora precisamos alterar a autenticação. Aqui as mudanças serão mais substanciais.

Já não será possível verificar a correção do par login-senha imediatamente, com uma única consulta. Por quê: porque, para verificar a senha, é necessário obter seu hash com salt, e o salt está armazenado no banco de dados e é único para cada login.

Será necessário primeiro obter o registro apenas pelo login, ler o salt, aplicar o salt à senha inserida e comparar com a senha com salt do banco de dados, e somente se coincidirem, - autenticar o usuário.

Leve em consideração que pode acontecer do login digitado estar incorreto, neste caso a verificação da senha pode ser omitida, e imediatamente informar que a autenticação não é possível - dados incorretos:

html<?php
  $login = $_POST['login'];
  
  $query = "SELECT * FROM users WHERE login='$login'";
  $res = mysqli_query($link, $query);
  $user = mysqli_fetch_assoc($res);
    
  if (!empty($user)) {
    // existe um usuário com este login, agora é preciso verificar a senha...
  } else {
    // não há usuário com este login, exiba uma mensagem
  }
?>

Vamos adicionar a verificação da senha:

html<?php
  $login = $_POST['login'];
  
  $query = "SELECT * FROM users WHERE login='$login'";
  $res = mysqli_query($link, $query);
  $user = mysqli_fetch_assoc($res);
    
  if (!empty($user)) {
    $salt = $user['salt']; // salt do banco de dados
    $hash = $user['password']; // senha com salt do banco de dados
    
    $password = md5($salt . $_POST['password']); // senha com salt do usuário
    
    // Comparamos os hashes com salt
    if ($password == $hash) {
      // está tudo ok, autenticamos...
    } else {
      // a senha não confere, exiba uma mensagem
    }
  } else {
    // não há usuário com este login, exiba uma mensagem
  }
?>

Por motivos de segurança, normalmente não se informa ao usuário o que exatamente não conferiu - o login ou a senha, para dificultar a tentativa de pares login-senha por hackers. Simplesmente exibe-se uma mensagem informando que o par login-senha está incorreto ou algo nesse sentido.

Задание 1

Implemente a autenticação com senha com salt descrita acima. Tente registrar-se, autenticar-se, certifique-se de que tudo funciona.