Přidání soli do registrace

Takže už víte, že hashování pomocí md5 - je nevratný proces a hacker, který získá přístup k hashi, nebude moci získat z tohoto hashe heslo.

Ve skutečnosti toto tvrzení není úplně správné - v současné době zlí hackeři sestavili knihovny hashů populárních a méně populárních hesel a každý hlupák může heslo rozluštit prostě vygooglením jeho hashe.

Jde o dostatečně jednoduchá, populární hesla.

Vygooglete například hash 827ccb0eea8a706c4c34a16891f84e7b a hned ve vyhledávání Googlu uvidíte, že to je heslo '12345'.

Hashe dostatečně složitých hesel tímto způsobem nelze rozluštit (zkuste).

Můžete se ptát, v čem je pak problém - pojďme se všichni registrovat se složitými hesly. Existuje však problém - většina uživatelů nepřemýšlí o bezpečnosti svých dat a mohou zadávat dostatečně jednoduchá hesla.

Při registraci můžeme nutit vymýšlet delší hesla tím, že omezíme například minimální počet znaků na 6 nebo 8, avšak i tak se budou objevovat hesla jako '123456' nebo '12345678'.

Lze samozřejmě vymyslet chytřejší algoritmus kontroly složitosti hesla, ale existuje jiné řešení.

Podstata tohoto řešení je taková: hesla je třeba posolit. Sůl - je speciální náhodný řetězec, který se přidá k heslu při registraci a hash se bude počítat ne z prostého hesla, ale z řetězce sůl+heslo, tedy z osoleného hesla.

To znamená, že při registraci budete dělat něco takového:

html<?php
  $salt = '1sJg3hfdf'; // sůl - složitý náhodný řetězec
  $password = md5($salt . $_POST['password']); // převedeme heslo na osolený hash
?>

Přičemž sůl bude pro každého uživatele jiná, je třeba ji generovat náhodně v momentě registrace.

Zde je hotová funkce, která to udělá:

html<?php
  function generateSalt()
  {
    $salt = '';
    $saltLength = 8; // délka soli
    
    for($i = 0; $i < $saltLength; $i++) {
      $salt .= chr(mt_rand(33, 126)); // znak z ASCII tabulky
    }
    
    return $salt;
  }
?>

S pomocí této funkce můžeme přepsat náš kód takto:

html<?php
  $salt = generateSalt(); // sůl
  $password = md5($salt . $_POST['password']); // osolené heslo
?>

Ještě jednou zopakuji, že to byly změny při registraci - do databáze ukládáme ne prostý hash hesla, ale hash osoleného hesla.

To ještě není vše: v tabulce s uživateli kromě pole login a password je třeba vytvořit ještě pole salt, ve kterém budeme ukládat sůl každého uživatele.

Задание 1

Realizujte výše popsanou registraci s osoleným heslem.