password_hash-funktio
Itse asiassa funktio md5 ja salasanan
suolaaminen sen avulla on vanhentunutta.
Opimme sen, jotta ymmärtäisit jatkomateriaalia,
ja myös koska saatat kohdata sitä työskennellessäsi
muiden projektien parissa.
On olemassa kehittyneempi tapa saada
suolattu salasana. Tätä varten käytetään funktiota
password_hash. Se ottaa ensimmäisenä parametrina
merkkijonon ja toisena - salausalgoritmin
(siitä myöhemmin), ja palauttaa tämän merkkijonon hash-arvon
yhdessä suolan kanssa.
Kokeile ajaa tämä koodi useita kertoja:
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
Saat joka kerta erilaisen tuloksen, ja tässä tuloksessa merkkijonon ensimmäinen osa on suola ja toinen osa - suolattu salasana.
Oletetaan, että meillä on hash-arvo, joka on saatu funktiosta
password_hash ja jokin salasana. Jotta
voidaan tarkistaa, onko tämä tämän salasanan hash vai ei,
tulee käyttää funktiota password_verify
- se ottaa ensimmäisenä parametrina salasanan,
ja toisena - hash-arvon, ja palauttaa true
tai false.
Katsotaanpa esimerkkiä:
<?php
$password = '12345'; // salasana
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // hash
if (password_verify($password, $hash)) {
// hash tästä salasanasta
} else {
// hash ei ole tästä salasanasta
}
?>
Mitä tämä meille käytännössä antaa: meidän ei tarvitse luoda tietokantaan erillistä kenttää suolan tallentamiseen, eikä tarvitse vaivautua suolan generoimiseen - PHP hoitaa kaiken puolestamme!
Eli käy niin, että tietokannassa kentässä
password tallennamme suolatun
salasanan yhdessä sen suolan kanssa. Samalla hash-pohjainen
salasana on pidempi. Siksi
tietokannassa meidän on korjattava
salasanakentän koko ja asetettava se 60
merkkiin.
Korjataan nyt rekisteröintikoodi. Tässä on mitä on nyt:
<?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;
}
$salt = generateSalt(); // suola
$password = md5($salt . $_POST['password']); // muunnetaan salasana suolatuksi hashiksi
?>
password_hash:n avulla voimme lyhentää tämän muotoon:
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
Samalla tavalla korjataan kirjautumiskoodi:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'"; // haetaan käyttäjä tunnuksen perusteella
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$hash = $user['password']; // suolattu salasana tietokannasta
// Tarkistetaan tietokannan hash-arvon vastaavuus annettuun salasanaan
if (password_verify($_POST['password'], $hash)) {
// kaikki kunnossa, kirjaudutaan...
} else {
// salasana ei täsmää, näytetään viesti
}
} else {
// käyttäjää tällä tunnuksella ei ole, näytetään viesti
}
?>
Muokkaa kirjautumisesi ja rekisteröintisi uusien opittujen funktioiden mukaisiksi.