Suolan lisääminen rekisteröintiin
Siis, tiedät jo, että hashaus
md5:llä on peruuttamaton prosessi ja hakkeri,
joka saa pääsyn hashiin, ei voi saada
salasanaa tästä hashista.
Itse asiassa tämä väite ei ole aivan totta - nykyään pahat hakkerit ovat koonneet suosittujen ja vähemmän suosittujen salasanojen hash-kirjastoja, ja kuka tahansa voi selvittää salasanaa yksinkertaisesti googlaamalla sen hashin.
Kyse on riittävän yksinkertaisista, suosituista salasanoista.
Googlaa esimerkiksi hash 827ccb0eea8a706c4c34a16891f84e7b
ja näet heti Googlen haussa, että se on
salasana '12345'.
Riittävän monimutkaisten salasanojen hasheja ei voi selvittää tällä tavalla (kokeile).
Voit kysyä, missä on sitten ongelma - rekisteröidytään kaikki monimutkaisilla salasanoilla. Siinä on kuitenkin ongelma - useimmat käyttäjät eivät ajattele tietojensa turvallisuutta ja voivat käyttää riittävän yksinkertaisia salasanoja.
Voimme rekisteröinnissä pakottaa keksimään
pitempiä salasanoja rajoittamalla esimerkiksi
vähimmäismäärää merkkejä 6:lla
tai 8:lla, mutta silti ilmestyy
salasanoja kuten '123456' tai '12345678'.
Voi tietysti keksiä älykkäämman algoritmin salasanan monimutkaisuuden tarkistamiseksi, mutta on toinen ratkaisu.
Tämän ratkaisun ydin on: salasanoja täytyy suolata. Suola on erityinen satunnainen merkkijono, joka lisätään salasanaan rekisteröinnissä ja hash lasketaankin ei yksinkertaisesta salasanasta, vaan merkkijonosta suola+salasana, eli suolatusta salasanasta.
Eli rekisteröinnissä teet jotain tällaista:
<?php
$salt = '1sJg3hfdf'; // suola - monimutkainen satunnainen merkkijono
$password = md5($salt . $_POST['password']); // muunnetaan salasana suolatuksi hashiksi
?>
Tällöin suola on erilainen jokaiselle käyttäjälle, se on generoitava satunnaisesti rekisteröinthetkellä.
Tässä on valmis funktio, joka tekee tämän:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // suolan pituus
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // merkki ASCII-taulukosta
}
return $salt;
}
?>
Tämän funktion avulla voimme kirjoittaa koodimme uudelleen näin:
<?php
$salt = generateSalt(); // suola
$password = md5($salt . $_POST['password']); // suolattu salasana
?>
Toistan vielä, että nämä olivat muutoksia rekisteröinnissä - tietokantaan tallennamme ei pelkkää salasanan hashia, vaan suolatun salasanan hashin.
Ei siinä kaikki: käyttäjien taulukkoon lisäksi
kenttiin login ja password tarvitaan
myös kenttä salt, jossa
voimme tallentaa kunkin käyttäjän suolan.
Toteuta edellä kuvattu rekisteröinti suolatuilla salasanoilla.