Fil-qosor: Il-passwords taħżnuhom f'PHP b'password_hash() u tivverifikawhom b'password_verify(). Il-valur awtomatiku PASSWORD_DEFAULT bħalissa juża bcrypt, minn PHP 8.4 b'fattur tal-ispiża 12; fejn PHP huwa kkumpilat b'Argon2, PASSWORD_ARGON2ID hija alternattiva tajba. Hashes qodma ta' MD5 jew SHA-1 tibdluhom billi tgħatuhom minnufih ġo password_hash u tissostitwuhom, fil-login li jmiss, b'hash dirett.
X'għandu x'jaqsam it-tnixxija tad-database mal-hashes tagħkom
Wara dħul f'web server, id-database hija waħda mill-ewwel miri. Min jista' jesegwixxi kodiċi fuq is-server, kif hu possibbli b'PHP2Shell, jaqra wkoll id-dettalji tal-aċċess tal-applikazzjoni u b'hekk it-tabella tal-kontijiet tal-utenti. Jekk il-passwords fiha jsiru leġġibbli wara sigħat jew wara snin, dan ma jiddeċiedix fil-jum tal-attakk, imma waqt il-programmar.
Sorprendentement ħafna applikazzjonijiet għadhom jaħżnu l-passwords b'proċeduri li qatt ma kienu maħsuba għal dan l-iskop: MD5, SHA-1, SHA-256 sempliċi jew saħansitra ċċifrati b'mod riversibbli. Dawn il-proċeduri huma mgħaġġla, u eżattament dan huwa l-problema. L-attakkanti jistgħu b'hekk jippruvaw ħafna kandidati kull sekonda.
PHP għandu żmien twil li jġib soluzzjoni li tikkalkula bil-mod, toħloq awtomatikament salt għal kull password u taħżen il-proċedura u l-parametri fl-hash stess. Trid sempliċement tużawha b'mod konsistenti.
password_hash f'PHP: bcrypt jew Argon2id?
password_hash() jaf diversi proċeduri. L-għażla skont il-manwal ta' PHP:
| Kostanti | Proċedura | Nota |
|---|---|---|
PASSWORD_DEFAULT |
bħalissa bcrypt | Valur awtomatiku, jista' jinbidel f'verżjonijiet futuri |
PASSWORD_BCRYPT |
bcrypt | Fattur tal-ispiża minn PHP 8.4 b'mod awtomatiku 12, qabel 10; jgħoddu biss l-ewwel 72 byte |
PASSWORD_ARGON2I |
Argon2i | minn PHP 7.2, biss jekk PHP inbena b'appoġġ għal Argon2 |
PASSWORD_ARGON2ID |
Argon2id | minn PHP 7.3, l-istess prerekwiżit |
OWASP jirrakkomanda Argon2id bħala l-ewwel għażla, b'mill-inqas 19 MiB ta' memorja, żewġ passaġġi u thread wieħed, u bcrypt l-aktar għal sistemi eżistenti. Għall-biċċa l-kbira tal-applikazzjonijiet PHP id-differenza fil-prattika hija iżgħar mid-differenza bejn kwalunkwe waħda minn dawn il-proċeduri u MD5. L-aktar importanti huwa li tużaw waħda minnhom u li tadattaw il-parametri regolarment.
Jekk Argon2id hux disponibbli jurih test qasir:
<?php
var_dump(defined('PASSWORD_ARGON2ID'));
var_dump(password_algos());
Aħżen u ivverifika: mudell komplut
L-eżempju li ġej juri r-reġistrazzjoni u l-login b'aġġornament awtomatiku ta' hashes skaduti. Il-verifika tat-tul tipproteġi mil-limitu ta' 72 byte ta' bcrypt:
<?php
declare(strict_types=1);
const PASSWORT_ALGO = PASSWORD_DEFAULT;
function passwortSpeichern(string $passwort): string
{
if (strlen($passwort) > 72) {
throw new InvalidArgumentException('Passwort zu lang für das gewählte Verfahren.');
}
return password_hash($passwort, PASSWORT_ALGO);
}
function passwortPruefen(string $eingabe, string $gespeicherterHash, callable $hashAktualisieren): bool
{
if (!password_verify($eingabe, $gespeicherterHash)) {
return false;
}
if (password_needs_rehash($gespeicherterHash, PASSWORT_ALGO)) {
$hashAktualisieren(password_hash($eingabe, PASSWORT_ALGO));
}
return true;
}
strlen() jgħodd byte, mhux karattri. Dan hawnhekk huwa intenzjonat, għax il-limitu ta' bcrypt jirreferi għal byte. Il-kolonna fid-database għandha, skont il-manwal, tkun tista' żżomm aktar minn 60 karattru, 255 huwa għażla tajba. Qatt ma twaqqfu salt proprju: l-għażla hija skaduta u minn PHP 8.0 tiġi injorata.
Mal-bidla għal PHP 8.4 il-fattur tal-ispiża awtomatiku għal bcrypt jogħla minn 10 għal 12. Hashes eżistenti, grazzi għal password_needs_rehash(), jiżdiedu awtomatikament fil-login li jmiss. Fuq sistemi mgħobbija ħafna jixraq qabel il-bidla test qasir tat-tagħbija tal-login.
Ikkalkulaw il-fattur tal-ispiża fuq is-server tal-produzzjoni tagħkom. Verifika waħda għandha tieħu ħin ta' kalkolu apprezzabbli, imma tibqa' b'mod ċar taħt sekonda, biex il-logins ma jsirux konġestjoni meta jkun hemm tagħbija.
Neħħu hashes qodma ta' MD5 u SHA-1
L-isfida vera hija ġeneralment l-istokk eżistenti. Il-passwords stess ma tafuhomx, allura ma tistgħux sempliċement terġgħu tagħmluhom hash. Li tistennew sakemm kull utent jerġa' jidħol iħalli kontijiet inattivi mhux protetti. OWASP għalhekk jiddeskrivi proċedura f'żewġ stadji:
- Daħħlu minnufih: Kull valur eżistenti ta' MD5 jew SHA-1 agħmluh b'skript ġo
password_hash()u aħżnuh b'marka, pereżempju f'kolonnahash_typ. - Ivverifikaw fil-login: Għall-kontijiet immarkati l-ewwel ikkalkulaw l-input bil-proċedura l-qadima u mbagħad ivverifikaw b'
password_verify()kontra l-valur ippakkjat. - Issostitwixxu direttament: Wara login b'suċċess oħolqu hash normali mit-test ċar u neħħu l-marka.
- Naddfu l-bqija: Kontijiet li wara terminu stabbilit għad għandhom hashes ippakkjati, poġġuhom fuq reset tal-password.
<?php
// Stadju 1 (darba b'skript): $neu = password_hash($alterMd5Wert, PASSWORD_DEFAULT);
// Stadju 2 u 3 fil-login:
if ($konto['hash_typ'] === 'md5-umhuellt') {
$ok = password_verify(md5($eingabe), $konto['passwort_hash']);
if ($ok) {
$speichere(password_hash($eingabe, PASSWORD_DEFAULT), 'direkt');
}
}
Hashes ippakkjati huma aħjar minn valuri xotti ta' MD5, imma aktar dgħajfa minn hashes diretti. Huma soluzzjoni ta' tranżizzjoni, mhux għan. Wara inċident li fih id-database tista' tkun affettwata, din il-bidla ma tissostitwix it-talba lill-utenti biex ibiddlu l-passwords tagħhom. Liema traċċi jindikaw inċident bħal dan jiddeskrivi Diġà kompromess?.
Pepper, ċifrar u mogħdijiet żbaljati oħra
Xi ideat jinstemgħu bħala aktar sigurtà, imma jġibu ftit jew jagħmlu ħsara:
- Kostruzzjonijiet proprji ta' hash bħal SHA-256 b'ripetizzjonijiet b'salt iġġenerat minnkom huma aktar mgħaġġla minn bcrypt u għalhekk aktar dgħajfa.
- Passwords ċċifrati huma riversibbli. Jekk iċ-ċavetta tinsab fuq l-istess server, iċ-ċifrar wara dħul bilkemm jipproteġi.
- Pepper, jiġifieri valur sigriet addizzjonali għall-passwords kollha, jista' jkun saff addizzjonali jekk jinżamm separat mid-database. Imma ma jissostitwix proċedura tajba ta' hash u jagħmel bidliet futuri aktar diffiċli.
- Pre-hashing qabel bcrypt, biex jiġi evitat il-limitu ta' 72 byte, iġorr, skont OWASP, riskji proprji. Limitu ċar tat-tul jew Argon2id huwa aktar sempliċi.
Anke fir-regoli għal passwords ġodda jixraq li titfgħu ħarsa lejn l-istat tat-teknika: it-tul jipproteġi aktar minn rekwiżiti kumplessi dwar karattri speċjali, u passwords komuni ħafna jew li diġà dehru fi tnixxijiet tad-data għandhom jiġu miċħuda. Bidliet furzati f'intervalli fissi mingħajr motiv, skont l-esperjenza, iwasslu aktar għal mudelli prevedibbli milli għal passwords aktar b'saħħithom.
Għal sistemi ta' login il-passwords ma jibqgħux qatt waħedhom: proċeduri b'żewġ fatturi għall-admins u brejk kontra tentattivi massivi ta' login jissupplimentaw l-ħażna. It-tnejn jittrattahom il-gwida Ipproteġi l-logins tal-admin minn brute force. Għal links ta' reset u kodiċijiet ta' darba japplikaw regoli oħra, ara Numri każwali u tokens sikuri f'PHP. Ħarsa ġenerali lejn funzjonijiet oħra tagħti Funzjonijiet ta' sigurtà inkorporati ta' PHP.
Kif tgħin PHP SOS b'mod konkret?
- Niċċekkjaw kif l-applikazzjoni u l-plugins tagħkom jaħżnu l-passwords u nsibu proċeduri skaduti anke f'funzjonijiet sekondarji.
- Nippjanaw il-bidla tal-istokk b'ippakkjar, migrazzjoni fil-login u terminu għall-kontijiet li jifdal.
- Nadattaw il-fattur tal-ispiża jew il-parametri ta' Argon2 għas-servers tagħkom.
- Wara inċident insostnu d-deċiżjoni dwar resets tal-password u l-implimentazzjoni teknika tagħhom.
Verifika tas-softwer PHP proprju noffruha bħala Awditu tas-sigurtà u test ta' penetrazzjoni.
Mistoqsijiet frekwenti
Liema algoritmu juża password_hash b'PASSWORD_DEFAULT?
Bħalissa bcrypt. Il-manwal ta' PHP jindika li l-valur awtomatiku jista' jinbidel meta jiżdiedu proċeduri aktar b'saħħithom. Għalhekk il-kolonna tad-database għandha tkun tista' żżomm aktar minn 60 karattru; il-manwal isemmi 255 bħala għażla tajba.
Għandi niċċifra l-passwords minflok nagħmilhom hash?
Le. Passwords iċċifrati jistgħu jinqraw mill-ġdid biċ-ċavetta, u din iċ-ċavetta spiss tinsab fuq l-istess server. Hash ta' password huwa triq f'direzzjoni waħda: l-applikazzjoni tista' biss tivverifika jekk input jaqbilx.
Kemm għandu jkun għoli l-fattur tal-ispiża f'bcrypt?
Minn PHP 8.4 il-valur awtomatiku huwa 12, qabel 10. OWASP isemmi 10 bħala l-limitu l-aktar baxx u jirrakkomanda li tgħollu daqs kemm jifilħu s-servers tagħkom. Ikkalkulaw fuq il-hardware proprju kemm idum jieħu verifika waħda.
X'tfisser il-limitu ta' 72 byte f'bcrypt?
bcrypt jikkunsidra biss l-ewwel 72 byte ta' password, dak li jiġi wara jinqata'. Fil-każ ta' karattri speċjali, karattru wieħed spiss jgħodd żewġ byte. Illimitaw it-tul b'mod espliċitu jew uża Argon2id jekk PHP tagħkom huwa kkumpilat miegħu.
L-utenti jridu jbiddlu l-passwords wara dħul?
Jekk ma jistax jiġi eskluż li d-database ħarġet, għandkom tirranġaw dan. Hashes tajbin inaqqsu b'mod konsiderevoli l-qsim, imma passwords dgħajfa jibqgħu vulnerabbli. Jekk teżistix barra minn hekk obbligu ta' notifika, iċċaruh mal-uffiċjal tal-protezzjoni tad-data tagħkom.