Só hozzáadása a regisztrációhoz

Tehát, már tudod, hogy a md5 hash-elés visszafordíthatatlan folyamat, és egy hacker, aki hozzáfér a hash-hez, nem tudja visszanyerni belőle a jelszót.

Valójában ez az állítás nem teljesen igaz - jelenleg a rosszindulatú hackerek összeállítottak népszerű és kevésbé népszerű jelszavak hash könyvtárait és bárki képes kitalálni a jelszót, egyszerűen rákeresve a hash-ére.

Ez elég egyszerű, népszerű jelszavakra vonatkozik.

Keress rá például a 827ccb0eea8a706c4c34a16891f84e7b hash-re és azonnal a Google keresőben látni fogod, hogy ez a '12345' jelszó.

Az elég bonyolult jelszavak hash-eit ilyen módon nem lehet kitalálni (próbáld ki).

Kérdezheted, hogy akkor mi a probléma - mindannyian regisztráljunk bonyolult jelszavakkal. Van azonban egy probléma - a legtöbb felhasználó nem gondol adatai biztonságára és elég egyszerű jelszavakat használhat.

A regisztrációnál kényszeríthetjük őket, hogy hosszabb jelszavakat találjanak ki, például korlátozva a minimális karakter számot 6 vagy 8, de így is előfordulnak '123456' vagy '12345678' típusú jelszavak.

Lehetne persze, okosabb algoritmust kitalálni a jelszó bonyolultságának ellenőrzésére, de van más megoldás is.

Ennek a megoldásnak a lényege: a jelszavakat meg kell sózni. A só egy speciális véletlenszerű string, ami a regisztrációnál hozzáadódik a jelszóhoz, és a hash nem a sima jelszóról, hanem a só+jelszó stringről, azaz a sózott jelszóról számítódik ki.

Tehát a regisztrációnál valami ilyesmit kell csinálni:

html<?php
  $salt = '1sJg3hfdf'; // só - bonyolult véletlenszerű string
  $password = md5($salt . $_POST['password']); // átalakítjuk a jelszót sózott hash-é
?>

Ebben az esetben a só minden felhasználó esetében más lesz, véletlenszerűen kell generálni a regisztráció pillanatában.

Itt egy kész függvény, amely ezt megteszi:

html<?php
  function generateSalt()
  {
    $salt = '';
    $saltLength = 8; // a só hossza
    
    for($i = 0; $i < $saltLength; $i++) {
      $salt .= chr(mt_rand(33, 126)); // karakter az ASCII-táblából
    }
    
    return $salt;
  }
?>

Ezzel a függvénnyel így írhatjuk át a kódunkat:

html<?php
  $salt = generateSalt(); // só
  $password = md5($salt . $_POST['password']); // sózott jelszó
?>

Ismétlem, ezek a regisztrációnál történtek - az adatbázisban nem egyszerűen a jelszó hash-ét tároljuk, hanem a sózott jelszó hash-ét.

És ez még nem minden: a felhasználók táblájában a login és password mezők mellett kell egy salt mező is, amelyben minden felhasználó sóját tároljuk.

Задание 1

Valósítsa meg a fent leírt sózott jelszavas regisztrációt.