Saglabājiet un izgūstiet paroles, izmantojot PHP

Slikta drošība var būt liktenīga, jo Marija Skotu karaliene jums teiktu, ja viņa vēl šodien būtu dzīva (lai gan viņa, iespējams, runātu tikai franču valodā, lai jūs varētu viņu nesaprast). Kopā ar dažiem katoļu muižniekiem viņa pēc galvenā sazvērnieka iecerēja gāzt māsīcas karalienes Elizabetes valdību tajā, kas kļuvis pazīstams kā Babingtonas sižets. Marija apmainījās ar Babingtonu ar vēstules par zemes gabalu, izmantojot dobus alus mucu aizbāžņus, un katrs burts tika pasargāts no nevēlamiem skatieniem, izmantojot aizstājējšifru, kas sastāv no 59 simboliem, kas apzīmē burtus un kopīgas frāzes.

Par nelaimi Mērijai, sers Frensiss Valshems - Elizabetes spymaster - pārtvēra katru mucu, izvilka vēstuli, atšifrēja to un nomainīja, lai sazvērnieki nezinātu par viņa ielaušanos. Mariju atzina par vainīgu nodevībā, viņai piesprieda nāvessodu, un viņas 14 sazvērniekus pakāra, izlozēja un ceturtdaļā.



Mēs ceram, ka lielākā daļa no jums nestrādās šādās dzīvības un nāves situācijās, taču mēs visi zinām, ka klientu datu aizsardzība ir jebkura tiešsaistes biznesa prioritāte. Ja jūs glabājat paroles vienkāršā tekstā, jums ir jāpārvar vairākas lielas problēmas. Pirmkārt, ikviens, kuram ir visvienkāršākais tīkla sniffer, pēc vajadzības var skatīties jūsu tīmekļa paketes, izmantojot lietotāja paroles. Otrkārt, ikviens, kam ir piekļuve jūsu datu bāzēm - un, iespējams, daudzi cilvēki, ja izmantojat koplietojamā resursdatora risinājumu, var vienkārši nolasīt paroles tieši no jūsu tabulām. Treškārt, ikviens, kam ir piekļuve jūsu rezerves lentēm / diskiem / serveriem (it īpaši, ja izmantojat tiešsaistes rezerves risinājumu), var iegūt paroles tikpat viegli, it kā datu bāzes būtu lokāli.



Droša pārsūtīšana

Ja jūs jau izmantojat HTTPS, pārsūtīšanas laikā jūsu dati ir droši, bet glabāšanas vietā ir pilnīgi neaizsargāti - un mēs to varam izmantot, lai to novērstu. Ātrākais un vienkāršākais veids, kā aizsargāt paroles, ir hash izmantošana, kuru jūs varat iedomāties kā vienvirziena šifrēšanu; kas iet iekšā, nevar atgriezties. Ja domājat, ka tas ir bezjēdzīgi, padomājiet vēlreiz - tas ir ļoti drošs veids, kā saglabāt paroles, kad patiesībā nevēlaties uzzināt, kāda ir parole vienkāršā tekstā. Lai uzlabotu aizsardzību, PHP ir pilnīga šifrēšanas sistēma, kas spēj bloķēt pat visspējīgākos hakerus.

Lūdzu, ņemiet vērā, ka šifrēšana ir tikpat laba kā jūsu ieviešana. Pirms pāris gadiem WinZip savā produktā iekļāva AES šifrēšanu un apzīmēja to kā milzīgu soli uz priekšu drošības jomā. Diemžēl tā ieviešana bija slikta, un to varēja uzlauzt dažu minūšu laikā - tikai AES buzzword izmantošana viņus neglāba. Kā teica Brūss Šneiers: 'kriptogrāfija ir grūta, un, vienkārši izmantojot AES produktā, tas maģiski nepadara to drošāku.' Tātad, lai gan mūsu ieviešana šeit ir diezgan spēcīga, nepiesitiet to: labāk ir būt drošam nekā žēl!



Gan jaukšanai, gan šifrēšanai ir savs pielietojums: jaucējkrāni ir ļoti ātri izdarāmi, tiem nepieciešams ļoti maz koda un tos ir ārkārtīgi grūti izjaukt. Šifrēts teksts ir divvirzienu (tas nozīmē, ka jūs varat atgūt vienkāršo tekstu no šifra teksta), taču tas ir smags ar centrālo procesoru, un, ja kāds atklāj jūsu šifrēšanas atslēgu, viņš var izlasīt visus jūsu datus. PHP ir iebūvēts jaukšanas atbalsts, turpretim tā prasa, lai mcrypt bibliotēka varētu veikt šifrēšanu. Ja izmantojat operētājsistēmu Windows, noņemiet semikolu no faila php.ini rindas; extension = php_mcrypt.dll. Programmā Unix apkopojiet savu PHP ar --with-mcrypt.

1. Vieglākais veids, kā nodrošināt paroles, ir hash izmantošana, un visbiežāk sastopamā hash ir MD5 (MD ir Message Digest saīsinājums). Ievadot virkni funkcijā md5 (), jūs saņemsit 32 rakstzīmju jaucējmehānismu, kas unikāli identificē šo virkni.

Ir vairākas svarīgas lietas, kas jāzina par hashēm. Pirmkārt, dotā virkne katru reizi radīs vienu un to pašu hash; hash neatšķiras. Otrkārt, nedaudz atšķirīga virkne - pat tikai ar lielo burtu lietojot vienu burtu, kas iepriekš bija mazais - radīs ievērojami atšķirīgu jaukšanas vērtību. Treškārt, neatkarīgi no tā, cik ilga ir ievades virkne, izvades jaucējkrāsa vienmēr būs noteikta izmēra. MD5 gadījumā tas ir 32 rakstzīmes. Ceturtkārt, ir ļoti grūti atrast citu virkni, kas ģenerētu tādu pašu jaukšanas vērtību kā ievades virkne. Kad tas notiek (ja, piemēram, “sveika, Marija” un “sveika, Bobs”, piemēram, radītu vienādu jaukšanas vērtību), to sauc par “sadursmi”, bet izredzes atrast sadursmi ar MD5 hashēm ir šausmīgi mazas - aptuveni viens no 340 miljardiem miljardu miljardu miljardu miljardu miljardu miljardu miljardu miljardu. Tad diezgan niecīga.!



Tas ģenerēs šādu rezultātu:

6cd3556deb0da54bca060b4c394798
39
65a8e27d8879283831b664 Posb7f0a
d4
900150983cd24fb0d6963f7d28e17f
72
33ee255a4220346f442efd09325642
06

Ja jūs neredzētu avota kodu, nebūtu iespējams pateikt, kura jaucējkrāna radās no kādas virknes - tas ir jaukumu skaistums.

Tagad MD5 problēma ir tā, ka tā tagad ir salauzta - pētnieki var radīt MD5 sadursmi nedaudz vairāk kā stundas laikā, izmantojot ļoti jaudīgu datoru. Šī nav milzīga problēma, ja jūs nedomājat, ka hakeru leģioni apvienosies, lai salauztu jūsu datus, bet, ja vēlaties būt īpaši pārliecināts, ir vēl spēcīgāka jaukšanas sistēma, ko sauc par SHA1. Tas nozīmē Secure Hash algoritmu, un to izstrādāja ASV Nacionālās drošības aģentūra valdības vajadzībām. Tas darbojas tāpat kā MD5, izņemot to, ka tas rada 40 rakstzīmju jaukšanu. Tas, iespējams, neizklausās daudz spēcīgāk, bet aizkulisēs tā ir atšķirība starp 128 bitu jaukšanas vērtību (MD5) un 160 bitu jaukšanas vērtību (SHA1), un katrs papildu bits efektīvi divkāršo laiku, kas vajadzīgs brutālam spēka kapāt. Tātad, tas, kas pētniekiem aizņem stundu, lai uzlauztu MD5, viņiem, izmantojot SHA1, prasītu apmēram četras miljardus stundu.

SHA1 nav ideāls. Četri miljardi stundu ir labākais scenārijs, kurā hakerim ir jāizmēģina visas kombinācijas. Patiesībā, visticamāk, viņi to atradīs apmēram pusē no šī laika, izmantojot rupju spēku, un daudz mazāk laika atkal, ja viņi izmanto sarežģītāku uzbrukumu. Nepieļaujiet, ka tas jūs atbaida: SHA1 ir vairāk nekā pietiekami drošs, lai pasargātu jūs no visa, izņemot lielās valdības. Un vai jums nav ko no viņiem slēpt?

2. Tagad jūs zināt, kā darbojas jaukšana, mēs varam apvienot ātru paroļu autentifikācijas sistēmu, kas aizsargā paroles, izmantojot SHA1. Mums ir jāpieņem lietotāja ievade no veidlapas (viņu lietotājvārds un parole), jāmaisa parole un pēc tam jāpārbauda tā, lai jauktu paroļu datu bāzē būtu redzama atbilstība. Atcerieties, ka dotā virkne (šajā gadījumā lietotāja parole) vienmēr ģenerēs identisku jaukšanas vērtību, tāpēc mēs uzglabājam jaukšanas datubāzē un pārbaudām, vai tā nav jaukta lietotāja ievade. Kad lietotājs būs veiksmīgi autentificējies, mēs vēlēsimies saglabāt lietotāja ID kā sesijas vērtību, lai mēs zinātu, kas viņi ir. Lūk, kā tas izskatās PHP:

Jums būs pašiem jāiestata lietotāju tabula - lietotājvārdam jābūt VARCHAR laukam, kurā ir vismaz 15 rakstzīmes (dažiem cilvēkiem patīk patiešām garie lietotājvārdi!), Un Parolei jābūt CHAR laukam ar precīzi 40 rakstzīmēm.

3. Vēl viena jaucējkrāsa ir piemērota, lai pārbaudītu, vai faili ir pareizi lejupielādēti. Jebkuram Unix datoram (iespējams, Linux) tiks piegādāta programma md5sum, kas kā parametru ņem faila nosaukumu un atgriež šī faila MD5 jaucējkrātu. Tas būtībā visu faila saturu uztver kā virkni, kas nozīmē, ka, ja lejupielādes laikā faila pēdējā daļa ir bojāta, tā MD5 summa būs atšķirīga no oriģināla.

Praksē vietnes, kas piedāvā lielas lejupielādes, piemēram, Linux distro DVD ISO, kuru lielums parasti ir vismaz 2 GB, nodrošina MD5 summas par ISO, lai lejupielādētāji varētu pārbaudīt, vai viņi ir saņēmuši ISO pareizi, un nevis kādu korumpētu kopiju, vai vēl ļaunāk, kādu vīrusu - nomainīts hakeris, kuru izdevās ievietot serverī. Tā vietā, lai liktu jums pārveidot failu par virkni, pēc tam pats to jaukt, PHP nodrošina funkcijas md5_file () un sha1_file (), kuras faila nosaukumu uzskata par vienīgo parametru un atgriež šī faila jaukšanu. Piemēram:

echo md5_file('fedoracore5.iso');

Jā, sha1_file () veido ilgākas jaukšanas iespējas, kas ir daudz drošākas, taču šajā funkcijā tas nav saistīts ar drošību, bet tikai ar faila drošuma pārbaudi.

4. Pēdējā lieta, ko mēs izskatīsim, ir pareiza, divvirzienu šifrēšana. Atšķirībā no hashēm, reālā šifrēšana ļauj vienkāršā tekstā izgūt sākotnējo paroli no datu bāzes. Praksē atšķirība ir šāda: kad kāds aizmirst savu paroli, jums ir jāatjauno tā uz nejaušu paroli, ja izmantojat jaucējkrānu, bet ar šifrēšanu varat vienkārši nosūtīt viņam savu paroli.

Šeit tas kļūst grūti: ja jūs gatavojaties šifrēt, tas jādara pareizi. Tas nozīmē šifrēšanas algoritma un bloka šifra režīma izvēli, inicializācijas vektora izveidošanu, atslēgas ģenerēšanu un pēc tam faktiskās šifrēšanas veikšanu. Šifrēšanas algoritmi ir šī procesa pamatā: viņi izlemj, cik spēcīgs ir šifrēšanas process. Šajā piemērā mēs izmantosim 256 bitu Rijndael, kas pazīstams arī kā Advanced Encryption Standard (AES). Var viegli apgalvot, ka citi šifrēšanas algoritmi ir spēcīgāki par Rijndael (ja vēlaties pēc iespējas spēcīgāku, izmēģiniet 256 bitu Serpent), taču Rijndael priekšrocība ir tā, ka tas ir visā pasaulē pieņemts šifrēšanas standarts. Ja kādu dienu tas tiek uzlauzts, jums nav jāuztraucas, ka izvēlējāties neparastu algoritmu - neviens nekad neatlaida par standarta izvēli.

Bloka šifrēšanas režīms izlemj, kā tiek šifrēti atsevišķi jūsu teksta fragmenti. Vispopulārākā sistēma ir Cipher Block Chaining (CBC), kas sadala jūsu vienkāršo tekstu gabalos, šifrē pirmo bloku, pēc tam vienkāršā teksta tekstu no pirmā bloka izmanto XOR pret otro vienkāršā teksta bloku utt. Šī priekšrocība salīdzinājumā ar katra bloka vienkāršu šifrēšanu atsevišķi ir tā, ka tas padara vienkārša teksta dublikātu gabalus atšķirīgus. Visbeidzot, inicializācijas vektori (IV) ir paredzēti, lai balinātu vienkāršu tekstu - lai tas izskatās nejaušāks.

Lai izveidotu pareizi nejaušu šifrēšanas atslēgu, mēs izmantosim sha1 () jaukto virkni, kas sasmalcināta precīzi pēc AES pieprasītā izmēra. Paturot to prātā, šeit ir pieejams piemērs šifrēšanai, izmantojot PHP:

kā iestatīt privātumu Facebook fotogrāfijās

Lai atšifrētu, jums ir nepieciešams viens un tas pats kods, izņemot to, ka izmantojat mdecrypt_generic (), nevis mcrypt_generic (). Jā, pirms atšifrēšanas ir jāatver deinit () un jāaizver () mcrypt. Jā, tas ir ārkārtīgi daudz kodu, lai veiktu ļoti vienkāršu uzdevumu, taču tas ir ložu necaurlaidīgs - ja vien jūsu atslēga un IV paliek drošībā. Cerams, ka mēs varam tik daudz atstāt jūsu rīcībā.