Sāls pievienošana reģistrācijā
Tātad, jūs jau zināt, ka hešēšana, izmantojot
md5, ir neatgriezenisks process, un uzbrucējs,
kas ir iegūtis pieeju hešam, nevarēs iegūt
paroli no šī heša.
Patiesībā šis apgalvojums nav pilnīgi pareizs - pašlaik ļaunie uzbrucēji ir izveidojuši populāro un ne pārāk populāro paroļu hešu bibliotēkas, un jebkurš var atšifrēt paroli, vienkārši iekš meklētājprogrammā meklējot tās hešu.
Mēs runājam par pietiekami vienkāršām, populārām parolēm.
Izmēģiniet, piemēram, meklēt hešu 827ccb0eea8a706c4c34a16891f84e7b
un uzreiz meklētājprogrammas rezultātos jūs redzēsiet, ka tas ir
parole '12345'.
Pietiekami sarežģītu paroļu hešus šādā veidā nevar atšifrēt (izmēģiniet).
Jūs varat jautāt, kāda tad ir problēma - pieņemsim, ka mēs visi reģistrēsimies ar sarežģītām parolēm. Tomēr ir problēma - lielākā daļa lietotāju nedomā par savu datu drošību un var ievadīt pietiekami vienkāršas paroles.
Mēs reģistrācijas laikā varam piespiest izdomāt
garenākas paroles, ierobežojot, piemēram,
minimālo rakstzīmju skaitu līdz 6 vai
8, tomēr tik un tā parādīsies
paroles, piemēram, '123456' vai '12345678'.
Protams, var izdomāt gudrāku algoritmu paroles sarežģītības pārbaudei, bet ir cits risinājums.
Šī risinājuma būtība ir šāda: paroles ir jāsāļ. Sāls - īpaša nejauša virkne, kas reģistrācijas laikā tiks pievienota parolei, un hešs tiks aprēķināts nevis no vienkāršas paroles, bet no virknes sāls+parole, tas ir, no sālītās paroles.
Tas nozīmē, ka reģistrācijas laikā jūs darīsit apmēram šādi:
<?php
$salt = '1sJg3hfdf'; // sāls - sarežģīta nejauša virkne
$password = md5($salt . $_POST['password']); // pārveido paroli par sālītu hešu
?>
Šajā gadījumā sāls katrai lietotājam būs atšķirīga, tā ir jāģenerē nejauši reģistrācijas brīdī.
Lūk, gatava funkcija, kas to izdarīs:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // sāls garums
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // simbols no ASCII-tabulas
}
return $salt;
}
?>
Izmantojot šo funkciju, mēs varam pārrakstīt mūsu kodu šādi:
<?php
$salt = generateSalt(); // sāls
$password = md5($salt . $_POST['password']); // sālītā parole
?>
Vēlreiz atkārtošu, ka tās bija izmaiņas reģistrācijas laikā - datu bāzē saglabājam ne tikai paroles hešu, bet sālītās paroles hešu.
Tas vēl nav viss: lietotāju tabulā papildus
laukiem login un password ir jāizveido
arī lauks salt, kurā
mēs glabāsim katra lietotāja sāli.
Implementējiet iepriekš aprakstīto reģistrāciju ar sālītu paroli.