Додавање соли у ауторизацију

Сада морамо да променимо ауторизацију. Овде ће промене бити значајније.

Више неће бити могуће проверити исправност пара корисничко име-лозинка одмах, једним упитом. Зашто: јер, да би се проверила лозинка, потребно је добити њен солени хеш, а со се чува у бази података и јединствена је за свако корисничко име.

Мораћемо прво да добијемо запис само по корисничком имену, прочитамо со, посолимо унету лозинку и упоредимо са соленом лозинком из базе и само, ако се поклапају, - ауторизовати корисника.

Имајте у виду да може бити тако да је корисничко име унето погрешно, у том случају проверу лозинке не морамо да вршимо, већ одмах да испишемо да ауторизација није могућа - подаци нису тачни:

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)) {
    // корисник са таквим корисничким именом постоји, сада треба проверити лозинку...
  } else {
    // корисника са таквим корисничким именом нема, исписаћемо поруку
  }
?>

Хајде да додамо проверу лозинке:

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']; // со из БД
    $hash = $user['password']; // солена лозинка из БД
    
    $password = md5($salt . $_POST['password']); // солена лозинка од корисника
    
    // Поредимо солене хешеве
    if ($password == $hash) {
      // све је у реду, ауторизујемо...
    } else {
      // лозинка није добра, исписаћемо поруку
    }
  } else {
    // корисника са таквим корисничким именом нема, исписаћемо поруку
  }
?>

У циљу безбедности кориснику се обично не саопштава шта није у реду - корисничко име или лозинка, како би се отежало погодили пар корисничко име-лозинка хакерима. Једноставно се исписује порука о томе, да пар корисничко име-лозинка није тачан или нешто слично.

Задание 1

Имплементирајте горе описани начин ауторизације са соленом лозинком. Покушајте да се региструјете, ауторизујете, уверите се да све ради.