Siguria e fjalekalimeve

siguria fjalekalimeve 300x225 Siguria e fjalekalimeve

Siguria e aplikacioneve është një nga elementët që shqetëson më shumë programuesit dhe që duhet marrë me shumë seriozitet. Vrimat e sigurisë mund t’i lënë mundësi sulmuesit të marrë informacione të rëndësishme nga sistemi (fjalëkalime, emaile, etj) apo thjeshtë ta nxjerrin atë jashtë funksionimit normal. Një programues duhet të paktën të zotërojë bazat e sigurisë, në mënyrë që aplikacionet që ai krijon të jenë të sigurta nga sulmet e rëndomta. Një nga masat e rëndësishme për një aplikacion të sigurt dhe tema e këtij artikulli është kriptimi i fjalëkalimeve, në mënyrë që mos të bien në duar të gabuara. Le ta shtjellojmë më tej.

- Problemet e fjalëkalimeve të pa kriptuar -

Le të supozojmë që kemi një aplikacion ku për të pasur akses në zona të caktuara, përdoruesit duhet të regjistrohen në faqe me një e-mail dhe fjalëkalim. Pra unë jam përdorues dhe regjistrohem me fjalëkalimin “web12345” duke menduar se të dhënat janë të sigurta. Ndërkohë një sulmues tenton të gjejë vrima sigurie në sistem dhe arrin t’i gjejë duke përdorur një teknike shumë të përhapur (fatkeqësisht) si SQL Injections. Në dorën e sulmuesit është e gjithë tabela e përdoruesve me e-mailet e tyre dhe fjalëkalimet, duke i dhënë mundësi të identifikohet në sistem si kushdo përdorues. Imagjinoni që sistemi në fjalë të jetë për të blerë produkte! E gjithë kjo mund të parandalohej nëse kriptohej fjalëkalimi, pa harruar gjithashtu edhe vrimat ndaj SQL Injections.

- Çfarë është kriptimi? -

Kriptografia është shkenca e fshehjes së informacionit, në mënyrë që të lexohet vetëm nga personat apo sistemet që dinë ta dekriptojnë mesazhin. Për këtë artikull, ne na intereson më tepër një fushë e kriptografisë, që merret me kriptimin Hash, veçanërisht me funksionet një-krah. Duke i dhënë një vlerë për tu kriptuar, funksionet Hash një-krah gjenerojnë një fjalë me madhësi të caktuar e cila është e pamundur të dekriptohet në vlerën origjinale.

- MD5 -

MD5 (Message-Digest algorithm 5) është një funksion Hash shumë i përdorur në web dhe zgjedhja për kriptim në shumë aplikacione të njohura. Fjala e gjeneruar është 128 bit e gjatë me 32 karaktere heksadecimale. Në shumë përdorime sensitive, MD5 është abandonuar sepse është provuar dobësia e tij, megjithatë për qëllimin tonë e bën punën më së miri. Në PHP egziston një funksion që quhet pikërisht md5(), i cili gjeneron Hash-in e një vlere. Provoni kodin e mëposhtëm:

$fjalekalimi = 'web12345';
$hash = md5($fjalekalimi);
echo $hash;

Nëse e egzekutoni kodin, në ekran do t’ju printohet fjala Hash e atij fjalëkalimi (egzaktësisht: 1bfe5bbf619681e49cdc62d07badc4cb).

Me siguri po pyesni veten se si ta dekriptojmë këtë fjalëkalim, kur MD5 është një funksion që gjeneron një fjalë të pa dekriptueshme. Zgjidhja është e thjeshtë. Bëjmë krahasime të fjalëve Hash. Le të marrim një shembull:

Një përdorues regjistrohet në sistem me fjalëkalimin “nukegjendot”, i cili pas kriptimit me MD5 ruhet në databazë si c45f12cc8df8ad9b45141146e36200f2. Kur ky përdorues tenton të indetifikohet, ajo që do bëjmë është krahasimi i Hashit të ruajtur në databazë, me Hashin e fjalëkalimit që përdoruesi ka plotësuar. Një shembull në PHP:

//lidhja me databazen nuk perfshihet ne kete shembull
$emri = mysql_real_escape_string($_POST['emri']); //vlera e marre nga forma dhe e pastruar per tu futur ne query
$fjalekalimi = $_POST['fjalekalimi']; //vlera e marre nga forma
$hash = md5($fjalekalimi); //kriptojme fjalekalimin e futur

$rezultatet = mysql_query("SELECT id FROM perdoruesit WHERE emri='$emri' AND fjalekalimi='$hash'"); //kerkojme ne databaze nese ky emer dhe hash egziston
if(mysql_num_rows($rezultatet) == 1){ //nese ky if() eshte i vertete, te dhenat jane te sakta
 echo 'Te dhenat jane te sakta';
}

Shembulli më sipër është rasti më i thjeshtë i krahasimit të Hashit të fjalëkalimit me atë të ruajtur në databazë. Kjo teknikë vlen edhe për funksionet e tjera një-krahësh.

- SHA1 -

Ashtu si MD5, edhe SHA1 (familja SHA – Secure HAsh Standart) gjeneron një fjalë të pa dekriptueshme, por gjatësia e të cilës është 160 bit dhe 40 karaktere heksadecimale. SHA1 konsiderohet më i sigurt se MD5 në përgjithësi, edhe pse dobësi sigurie janë gjetur në të. Megjithatë, ashtu si MD5, për qëllimin tonë ky funksion e bën punën më së miri. PHP ofron një funksion sha1() për të gjeneruar fjalë të kriptuara. Konsideroni shembullin e mëposhtëm.

$fjalekalimi = 'web12345';
$hash = sha1($fjalekalimi);
echo $hash;

Nëse e egzekutoni kodin, do t’ju shfaqet kjo fjalë e kriptuar: 20d5b81872a334e86183db3dcd108717d182ffdf. Kë doni të zgjidhni midis MD5 dhe SHA1 mbetet tërësisht në dorën tuaj dhe asnjëri nuk ofron ndonjë avantazh mbi tjetrin për qëllimin tonë. Une personalisht kam zgjedhur të perdor SHA1, pa ndonjë arsye specifike.

- Siguria e funksioneve Hash një-krahësh dhe Salt -

Megjithëse teknikat MD5 dhe SHA1 janë praktikisht të pa kriptueshme, siguria sërish nuk është maksimale sepse egzistojnë mënyra për të gjetur vlerën e kriptuar. E di që mund t’ju duket e pamundur, por teknikat për “dekriptim” janë shumë të thjeshta. Le të marrim një shembull të thjeshtë për ta ilustruar.

Shumë përdorues përdorin fjalëkalime të thjeshta që mund të jenë edhe fjalë fjalori në rastin më të keq. Sulmuesi i cili ka arritur të gjejë fjalëkalimet te kriptuara, përdor një lloj “fjalori” (Rainbow Tables) me një numër masiv fjalësh dhe kombinime abstrakte gërmash të kriptuara në MD5 apo SHA1 dhe krahason Hashin e gjetur me to. Pra, ashtu si sistemet që ne kodojmë krahasojnë një Hash me një tjetër Hash të ruajtur në databazë, sulmuesi krahason një Hash me qindra mijëra (apo miliona) Hashe të tjera. Që një “fjalor” të jetë efikas duhet të përmbajë praktikisht të gjitha fjalët e fjalorit dhe miliona kombinime gërmash, numrash dhe karakteresh speciale të cilat do e bënin kërkimin të vështirë dhe të gjatë. Megjithatë, shumë fjalëkalime janë thyer në këtë mënyre. Atëherë si të rrisim sigurinë? Fare e thjeshtë; përdorim një Salt.

Salt është një fjalë që i shtohet fjalëkalimit dhe kriptohet së bashku me të, në mënyrë që rezultati përfundimtar të jetë i ndryshëm nga ai që pritet. Ta ilustrojmë me një kod PHP, sepse me fjalë mund të ngjajë me komplekse se në realitet.

$fjalekalimi = 'web12345';
$salt = 'internet';

echo md5($fjalekalimi); //1bfe5bbf619681e49cdc62d07badc4cb
echo md5($fjalekalimi . $salt); //597e5797991d2236256015b3af004693

Fjalëkalimit i kemi ngjitur një fjalë arbitrate (internet) e cila e modifikon tërësisht Hashin përfundimtar, duke e bërë fjalën të pa gjatshme në “fjalorët” e sipër përmendur pa njohur Saltin. Përmbajtja e Saltit është në dorën e programuesit dhe fantazia e tij. Mund të jetë një fjalë statike, emri i përdoruesit, një fjalë e rastësishme që ruhet në databazë, etj.

- Një mënyrë personale kriptimi -

Përmbajtja e kësaj pike është thjeshtë një mënyrë alternative kriptimi i fjalëkalimeve (e-maileve apo të tjera të dhëna sensitive) e cila ka të bëjë me krijimin e algoritmeve personalë për kriptim. Nëse krijoni sisteme me kod të hapur (Open Source), as mos e mendoni këtë alternative sepse do të ishte shumë e lehtë të gjehej algoritmi. Edhe në rast të kundërt, merreni parasysh vetëm për arsye edukative.

Kodi i mëposhtëm përdor një algoritëm fare të thjeshtë (ndoshta më i thjeshti në botë) enkriptimi dhe dekriptimi.

function enkripto($fjalekalimi){
 $alf = range('a', 'z');
 $fjalekalimiRi = '';
 for($i = 0; $i < strlen($fjalekalimi); $i++){
 if($fjalekalimi[$i] <= 126){
 $chr = ord($fjalekalimi[$i]);
 } else{
 $chr = $fjalekalimi[$i];
 }
 $rand = rand(0, count($alf)-1);
 $fjalekalimiRi .= $chr . $alf[$rand];
 }
 return strtoupper($fjalekalimiRi);
}

function dekripto($kriptimi){
 $fjalekalimi = '';
 $temp = '';
 for($i = 0; $i < strlen($kriptimi); $i++){
 if(is_numeric($kriptimi[$i])){
 $temp .= $kriptimi[$i];
 } else{
 $fjalekalimi .= chr($temp);
 $temp = '';
 }
 }
 return $fjalekalimi;
}

echo enkripto('web12345');
echo dekripto('119T101N98G49T50Z51Z52H53D');

Nëse akoma nuk e keni kuptuar se si ky algoritëm fare i thjeshtë funksionon, po ju them 2 fjalë. Fjalëkalimi kalohet gërmë për gërmë, e cila konvertohet në ekuivalentin në kod ASCII. Pas konvertimit, secilës gërmë i shtohet një karakter i rastësishëm i alfabetit, në mënyrë që të bëhet paksa më kriptik leximi. Dekriptimi po ashtu është i thjeshtë, ku lexohet fjala e kriptuar dhe skanohet gërmë për gërmë (numër për numër). Numrat ndahen nga gërmat për të përftuar kodet ASCII të cilat konvertohen në karaktere. Si thashë, algoritmi i kriptimin më i thjeshtë në botë.

Zbuluam dhe ilustruam teknikat më të përdorura në internet për kriptimin e fjalëkalimeve. Shpresoj t’ju kem dhënë një ide të mirë për funksionimin e tyre dhe t’ju kem treguar rëndësinë e kriptimit për siguri më të lartë. Nëse keni pyetje apo sygjerime mbi ato që janë shkruar në këtë artikull, jeni të lirë të komentoni. Teknikat alternative janë shumë të mirëpritura.

Posto këtë artikull në:
  • Bookmark tek RuajFaqet
  • Postoje tek Votoje
  • Postoje tek Kapsit
  • Postoje tek Ngjarjet
  • Postoje tek Lexoje
  • Facebook
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Technorati
  • Reddit
  • Twitter
  • StumbleUpon
  • Print this article!

Postime që mund të interesojnë:

  •  Siguria e fjalekalimeve

    PHP është ndoshta teknologjia për web më e njohur e më e përdorur, por gjithashtu edhe më e përfolura. Deri në vitet e fundit, PHP është konsideruar si një gjuhë programimi për web e drejtuar tek fillestarë ...

  •  Siguria e fjalekalimeve

    Duke u bazuar ne temat e meparshme si Mania Twitter dhe A është kthyer Twitter në sëmundje? që flasin vetëm për dizavantazhe të Twitter, kjo është një temë e cila shpjegon një avantazh të vogël të këtij shë ...

  •  Siguria e fjalekalimeve

    Parandalimi i sulmeve phishing nuk kërkon aftësi të avancuara të sigurisë. Përmes disa masave themelore mund të reduktojmë ndjeshëm këtë problem i cili është në rritje. Shumë njerëz internetin e përd ...

  •  Siguria e fjalekalimeve

    Dimë që shumë nga personat që kanë blogjet e tyre mundohen të gjejnë mënyra për tu rënditur sa më mir në motorët e kërkimit si Google,  Yahoo, apo Bing edhe për tu vlerësuar me PageRank sa më të lartë. N ...

  •  Siguria e fjalekalimeve

    Dokumenti .htaccess (Hypertext Access File) është një mjet për konfigurimin e webserverit Apache. Ky ështënjë dokument i thjeshtë i cili është i vendosur në root të faqes tuaj edhe që mund të ndryshohet me ...

9 Komente për “Siguria e fjalekalimeve”

  1. 1
    RomeoLab thotë:

    Postim i ri: Siguria e fjalekalimeve http://bit.ly/1C5pJK – #shqiperia

  2. 2
    romeolab thotë:

    Postim i ri: Siguria e fjalekalimeve http://bit.ly/1C5pJK – #shqiperia

  3. 3
    Romeo thotë:

    Shume flm per kete postim Joni,
    une nuk kisha shume njohuri nga kjo fushe. Kam ber pak kriptim e dekriptim ne java por gjera te thjeshta (rasti algoritmit te fundit) por nuk kisha njohuri per ne PHP :) Kisha degjuar e lexuar per MD5 sepse harroja ndonjeher passin e admin te faqeve te mia me joomla..
    Besoj dikush qe programon gjera i duhen keto njohuri

  4. 4
    Anon thotë:

    Artikull shume shume i mire, po fatkeqesisht, shumica e gabimeve ndodh kur njerezit zgjedhin passwords si 1″234,” ose “password” dhe bien viktima te phishing attacks. Duhet bere edukate per keto, gjithashtu.

    • 4.1
      Romeo thotë:

      Yeah,
      ke shume te drejte.Disa per ti ren shkurt zgjedhin passe te lehta ose vejne emrat e tyre si password ose ditlindjen. Ose si thua ndryshe e phishing :) Mua personalisht gjer me sot sme ka rastis (shyqyr zotit) te me marin ndonje pass :)

  5. 5
    Sid thotë:

    :) shume i mire artikulli sidomos kur sugjeron nje algoritem personal kriptimi.
    nje gje vetem kisha per te thene.
    te copeza e kodit ne lidhje me variablat nga POST the databaza mysql ka nje problem.
    i behet bypass shume kollaj qe con ne injektim SQL.
    nuk e di sa e pershtatshme eshte te jap nje shembull ketu.
    zgjidhja eshte vetem ‘prepared statements’ (kerkoj falje per terminologjine ne anglisht).

    • 5.1
      Romeo thotë:

      Hi Sid,

      per shembuj mund te vesh ca te duash pa problem :) Un personalisht sjam ekspert ne PHP kshu qe nuk ja kam shume idene :) .
      Megjithate nese don un mund te jap acc ne faqen time e te shkruash ndonje teme mbi dicka qe ke qef ose qe don te sqarosh. Persona qe kontribuojne ne kete faqe si Joni qe ka shkruar kete artikull jane te mirepritur. Nese ke qef per dicka te tille me thuaj . (Normalisht te gjith copyrightin mbi artikull e merr ti edhe del nje Info box ne fund si per te gjithe.)

      Flm

  6. 6
    Sid thotë:

    Pershendetje Romeo.
    Une ne fakt me php jam marre goxha. U be rreth 6 vjet qe punoj si programues php dhe sistemist. Mgjt duke qene se eshte kthyer ne nje teknologji teper te aplikuar ceshtjet behen edhe me te koklavitura.
    Dmth, ne versione te ndryshme te php, ne sisteme te ndryshme operative, panorama nderron ne menyre drastike.
    Me php ne versione para 5.2 dhe pa Suhosin patch ( ose ‘hardened php’ sic quhet , qe tani eshte bere standarti binar per sistemet *nix dhe ato te bazuara ne Linux) ai mekanizem bypassohet me lehtesi.
    Madje ne rastet kur perdoret GET dhe jo POST per kalimin e variablave, rrezultatet jane me te gjera.
    Per kete perfundim nuk marr dot merite, por duke ndjekur punen e specialistave si Shiflett e me rradhe, keto informacione mund te konsultohen.
    Sa per kontribut, do kisha kenaqesi.
    Mund te marr disa materiale nga blogu im (te cilat do te me duhet t’i rishktuaj ne shqip :D ).
    Mgjt mund te pregatis nje material ekskluziv mbi shkrimin e plugineve per XBMC ne Python (mediacenter popullor qe ne fakt une me kenaqesi kam pak qe e kam zbuluar) per te lejuar stream direkt te videove (filma/seriale) ne kompjuter dhe rrjedhimisht ne ekran e tv.

    Pershendetje edhe nje here

  7. 7
    Romeo thotë:

    Hi Sid,

    shume flm per infot edhe pse un ca gjera i kuptoj me veshtiresi ose me duhet te hap google e te kerkoj per me shume :) :P
    Per kontributin un do te kontaktoj me email (kete qe vendos kur ben komente) mbasi te mbaroj provimet e te sqarohemi me shume. Gjithashtu materialet mund te shkruash ca te duash (mire do ishte jo shume eksperte sepse sdo i merrte vesh njeri ose shume pak :P ) Se jan nga blogu jot ose ekskluzive ska problem. Fundja kjo eshte nje pune vullnetare e cdo gje eshte e mirepritur.
    Megjithate do te kontakoj me email sapo te mbaroj provimet.

    Flm per gjithcka

    Romeo

Komento:

  • Loading...
© Të gjithë të drejtat e mbrojtura | 2008 - 2009 RomeoLab.Com - Mobile - Privacy Policy - TOS - Hyrje