Funktionen password_hash
Faktisk anses funktionen md5 og salting
af adgangskoder med dens hjælp for at være forældet.
Vi studerede den, så du ville forstå det efterfølgende
materiale, og også fordi du kan støde på
dette, når du arbejder med andre folks projekter.
Der findes en mere avanceret måde at opnå
en saltet adgangskode på. Til dette bruges funktionen
password_hash. Den tager en streng som første parameter
og en krypteringsalgoritme som anden parameter
(mere om det senere), og returnerer et hash af strengen
sammen med salt.
Prøv at køre denne kode et par gange:
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
Du vil hver gang få et andet resultat, og i dette resultat vil den første del af strengen være saltet, og den anden del - den saltede adgangskode.
Lad os sige, at vi har et hash, der er opnået fra funktionen
password_hash og en eller anden adgangskode. For at
tjekke om dette er hash'et for denne adgangskode eller ej,
skal man bruge funktionen password_verify
- den tager adgangskoden som første parameter,
og hash'et som anden parameter, og returnerer true
eller false.
Lad os se på et eksempel:
<?php
$password = '12345'; // adgangskode
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // hash
if (password_verify($password, $hash)) {
// hash fra denne adgangskode
} else {
// hash ikke fra denne adgangskode
}
?>
Hvad giver det os i praksis: vi behøver ikke at oprette et separat felt i databasen for at gemme salt, ikke at bekymre os om at generere dette salt - PHP klarer alt for os!
Det vil sige, at det vil resultere i, at vi i databasen i feltet
password vil gemme den saltede
adgangskode sammen med dens salt. Samtidig vil den hashede
adgangskode have en større længde. Derfor
skal vi i databasen rette størrelsen
på adgangskodefeltet og sætte den til 60
tegn.
Lad os nu rette registreringskoden. Her er hvad vi har nu:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // saltlængde
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // tegn fra ASCII-tabellen
}
return $salt;
}
$salt = generateSalt(); // salt
$password = md5($salt . $_POST['password']); // omdanner adgangskoden til et saltet hash
?>
Med hjælp fra password_hash kan vi reducere dette til:
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
På samme måde justeres login-koden:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'"; // henter brugeren via login
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$hash = $user['password']; // saltet adgangskode fra DB
// Tjekker om hash'et fra databasen matcher den indtastede adgangskode
if (password_verify($_POST['password'], $hash)) {
// alt OK, logger ind...
} else {
// adgangskoden matchede ikke, vis besked
}
} else {
// der er ingen bruger med dette login, vis besked
}
?>
Omkonverter din login og registrering til de nye studerede funktioner.