Pridávanie soli pri registrácii

Takže už viete, že hashovanie pomocou md5 je nevratný proces a hacker, ktorý získa prístup k hashu, nebude môcť z tohto hashu získať heslo.

V skutočnosti toto tvrdenie nie je celkom správne - v súčasnosti zlí hackeri zostavili knižnice hashov populárnych a menej populárnych hesiel a každý hlupák môže heslo rozlúštiť jednoducho vyhľadaním jeho hashu.

Ide o dostatočne jednoduché, populárne heslá.

Vyhľadajte napríklad hash 827ccb0eea8a706c4c34a16891f84e7b a hneď vo vyhľadávaní uvidíte, že to je heslo '12345'.

Hashe dostatočne zložitých hesiel týmto spôsobom nejde rozlúštiť (skúste).

Môžete sa opýtať, v čom je potom problém - nech sa všetci zaregistrujeme so zložitými heslami. Je tu však problém - väčšina používateľov nemyslí na bezpečnosť svojich údajov a môžu zadávať dosť jednoduché heslá.

Môžeme pri registrácii nútiť vymýšľať dlhšie heslá, obmedzovaním napríklad minimálneho počtu znakov na 6 alebo 8, avšak aj tak sa budú objavovať heslá ako '123456' alebo '12345678'.

Samozrejme, môžeme vymyslieť inteligentnejší algoritmus kontroli zložitosti hesla, ale existuje iné riešenie.

Podstatou tohto riešenia je: heslá treba posoliť. Soľ - je to špeciálny náhodný reťazec, ktorý sa pridá k heslu počas registrácie a hash sa už bude počítať nie z jednoduchého hesla, ale z reťazca soľ+heslo, teda z osoleného hesla.

To znamená, že pri registrácii urobíte niečo takéto:

html<?php
  $salt = '1sJg3hfdf'; // soľ - zložitý náhodný reťazec
  $password = md5($salt . $_POST['password']); // premeníme heslo na osolený hash
?>

Soľ bude pre každého používateľa iná, treba ju generovať náhodne v čase registrácie.

Tu je hotová funkcia, ktorá to urobí:

html<?php
  function generateSalt()
  {
    $salt = '';
    $saltLength = 8; // dĺžka soli
    
    for($i = 0; $i < $saltLength; $i++) {
      $salt .= chr(mt_rand(33, 126)); // znak z ASCII tabuľky
    }
    
    return $salt;
  }
?>

Pomocou tejto funkcie môžeme prepísať náš kód takto:

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

Ešte raz zopakujem, že toto boli zmeny pri registrácii - do DB ukladáme nie jednoduchý hash hesla, ale hash osoleného hesla.

To ešte nie je všetko: v tabuľke s používateľmi okrem pola login a password je potrebné vytvoriť aj pole salt, v ktorom budeme ukladať soľ každého používateľa.

Задание 1

Realizujte vyššie opísanú registráciu s osoleným heslom.