Concepte

Prezentarea și securizarea datelor (encodare, criptare, hashing)

Encodare

Encodarea este folosită când dorim să prezentăm o serie de date sub o altă formă. De exemplu, când există caractere neprintabile în datele noastre, nu le putem afișa sub forma unui string. Base64 este un cunoscut exemplu de algoritm de encodare pentru că transformă orice vector de octeți într-un string de caractere printabile.

Este important de precizat faptul că encodarea nu ascunde/securizează informații, ci doar le prezintă sub o altă formă.

Folosind comanda base64 fără niciun parametru putem să encodăm un text.

student@uso:~$ echo -n "Base64 is not encryption!" | base64
QmFzZTY0IGlzIG5vdCBlbmNyeXB0aW9uIQ==

Utilizând parametrul -d putem decoda un text encodat.

student@uso:~$ echo -n "QmFzZTY0IGlzIG5vdCBlbmNyeXB0aW9uIQ==" | base64 -d
Base64 is not encryption!

Criptarea

Să presupunem că Alice și Bob doresc să comunice pe Internet. Pentru început, cei doi folosesc un canal simplu prin care transmit mesajele în clar. Problema care apare este că Trudy, care este rău intenționat, poate asculta ce vorbesc Alice și Bob și va și înțelege mesajele deoarece ele sunt transmise în clar.

Criptarea înseamnă ascunderea datelor folosind un algoritm public și o cheie secretă. În cazul nostru, Alice criptează mesajul pe care dorește să îl transmită, iar Bob îl decriptează. Alice și Bob au aceeași cheie secretă negociată într-un moment de timp anterior comunicării. Trudy vede în continuare mesajele, știe algoritmul de criptare (deoarece e public), dar nu cunoaște cheia de decriptare, deci nu poate vedea conținutul lor. Un exemplu de algoritm de criptare este AES.

Criptarea presupune ascunderea/securizarea datelor într-o manieră recuperabilă. Adică ele vor putea fi ulterior decriptate.

Folosind utilitarul openssl putem să criptăm conținutul unui fișier.

student@uso:~$ echo -n "plaintext content" > plaintext_file.txt
student@uso:~$ openssl aes-256-cbc -in plaintext_file.txt -out encrypted_file.enc -pass pass:"uso rules"
student@uso:~$ ls
encrypted_file.enc  plaintext_file.txt

Utilizând parametrul -d putem decripta fișierul encrypted_file.enc.

student@uso:~$ openssl aes-256-cbc -d -in encrypted_file.enc -out decrypted_file.txt -pass pass:"uso rules"
student@uso:~$ cat decrypted_file.txt 
plaintext content

Hashing

Hash-ul este o funcție one-way. Ea primește un input oricât de mare (1 byte, un cuvânt, un fișier, un întreg HDD, etc) și returnează un string de o dimensiune fixă în funcție de tipul de hash folosit. Hash-urile sunt rezistente la coliziuni, adică este extrem de greu de găsit 2 input-uri care să producă același hash. Mai mult, un singur bit schimbat în input va genera un output complet diferit. Exemple de algoritmi de hashing: md5 (învechit), SHA-1, SHA-256.

Hash-urile sunt folosite pentru verificarea integrității unui fișier (dacă chiar și un bit diferă, atunci va avea alt hash) și la stocarea parolelor.

Folosind comanda md5sum fără niciun parametru putem să generăm hash-ul unui text.

student@uso:~$ echo -n "plaintext content" | md5sum
f88d6c9eab9c6a2ef3cfd3c59832b4d6  -

Stocarea parolelor

1. Cea mai naivă abordare de stocare a parolelor într-o bază de date este în clar. Dacă un atacator reușește să obțină acces la baza de date respectivă, nu doar că obține acces la toate conturile, ci și la orice alt cont al unui utilizator de pe alt site unde a fost folosită aceeași parolă. Este evident că această abordare nu este sigură.

User Password
Mihai mereverzi
Radu usoemisto
Andrei usoemehmateemisto

2. O altă variantă (mai sigură) ar fi să nu stocăm parolele în clar, ci să stocăm hash-ul parolei în baza de date. Astfel, când un utilizator se loghează, facem hash-ul parolei introduse de el și îl comparam cu cel din baza de date.

User Password
Mihai 43eff133cceacbf1354369568b486450
Radu 4491fea305731261a83f75672e25bb88
Andrei 96f3e4decfcd7cd02c3027f0b6416b6e

Abordarea este într-adevăr mai bună, dar încă nu complet sigură. Deși hash-urile nu pot fi sparte direct (dintr-un hash să obținem mesajul inițial), ele pot fi atacate folosind dicționare. Un dicționar este o mulțime de corespondențe (hash_mesaj) → (mesaj). Pentru a sparge un hash, putem folosi dicționare mari online precum acesta. Dacă avem norocul ca hash-ul să se afle în dicționar, atunci obținem parola în clar. De obicei, acest lucru se întâmplă pentru toate parolele ce folosesc cuvinte cunoscute sau au o dimensiune/complexitate mică.

Pentru baza de date de mai sus, parola lui Mihai a putut fi spartă, dar cea a lui Andrei nu. Andrei a avut o parola mai lungă, dar acest lucru nu asigură neapărat siguranța ei.

3. O abordare finală ar fi să folosim un salt pentru hash-uirea parolei. Salt-ul este un string random de câteva caractere random ce se folosește în felul următor la construirea unui hash: Hash(salt | parolă), unde “|” înseamnă concatenare. Astfel, salt-ul previne atacul cu dicționar de mai sus deoarece este foarte puțin probabil ca hash-ul respectiv să existe într-un dicționar. Salt-ul se stochează în clar în baza de date.

Salt Password
Mihai dfd454ddf f98ad20d2f42dcd4e53a4d1f40f9c1a5

Pentru Mihai, este: Hash(dfd454ddfmereverzi).

Liste de cuvinte

John the Ripper este un utilitar de spargere al parolelor. În cadrul acestui demo dorim sa aflăm parolele utilizatorilor din sistem. Pentru a reduce timpul de brute-force al utilitarului John vom crea o listă de cuvinte.

Instalare John The Ripper

student@uso:~$ sudo apt-get update
student@uso:~$ sudo apt-get install john

Copiem hash-urile parolelor în fișierul mypasswd.txt.

student@uso:~$ sudo unshadow /etc/passwd /etc/shadow > mypasswd.txt

Creăm o listă de cuvinte care ne-ar putea ajuta sa ghicim parola unui calculator dintr-o universitate.

student@uso:~$ echo -ne "school\nuniversity\nstudent" > wordlist.txt

Rulăm utilitarul John the Ripper.

student@uso:~$ john --wordlist=wordlist.txt mypasswd.txt 
Loaded 3 password hashes with 3 different salts (crypt, generic crypt(3) [?/64])
Remaining 2 password hashes with 2 different salts
Press 'q' or Ctrl-C to abort, almost any other key for status
0g 0:00:00:00 100% 0g/s 50.00p/s 100.0c/s 100.0C/s school..student
Session completed

Pentru a vizualiza rezultatele rulăm următoarea comandă

student@uso:~$ john --format=crypt mypasswd.txt
[...] 
student@uso:~$ john --show mypasswd.txt 
student:student:1000:1000:Student User,,,:/home/student:/bin/bash
 
1 password hash cracked, 1 left

Utilitarul ne indică faptul că parola student este parola utilizatorului student.

HTTP vs HTTPS

Protocolul de rețea HTTP aduce beneficii din multe puncte de vedere. Unul dintre dezavantajele lui este faptul că toate datele sunt trimise în clar. Astfel, un atacator precum Trudy va putea intercepta și înțelege un pachet HTTP.

Acest start suplimentar necesar de criptare este adus de HTTPS, detaliat mai pe larg aici.

Least privilege

Principle of least privilege se referă la faptul că un utilizator, program, modul, etc va putea accesa doar informațiile și resursele necesare pentru desfășurarea activității intenționate.

Cu alte cuvinte, utilizatorul student va putea accesa doar fișierele și directoarele care îl privesc, nu și cele ce conțin date private ale altor utilizatori, de exemplu directorul /home/gion, care este home-ul utilizatorului gion.

În Linux, acest lucru se definește folosind permisiuni. Ne amintim de suita de comenzi chown, chgrp, chmod din laboratoarele trecute. Dorim de exemplu să îi dăm drepturi doar utilizatorului student pe directorul său de home:

 
 student@uso:~$ sudo chown student /home/student/ 
 student@uso:~$ sudo chgrp student /home/student/ 
 student@uso:~$ sudo chmod 700 /home/student/ 
 student@uso:~$ ls -l /home/ 
 total 4 
 drwx------ 23 student student 4096 dec  8 23:30 student 
 
 

Cu chown schimbăm ownerul directorului, cu chgrp schimbăm group ownerul, iar cu chmod îi permitem doar utilizatorului student să vadă sau modifice conținutul directorului /home/student.

Principle of least privilege se aplică foarte mult în zona de web. Se asigură astfel faptul că dacă o pagină a unui site a fost compromisă, nu va fi compromis întreg site-ul sau chiar întreg server-ul.

uso/laboratoare/laborator-10/concepts.txt · Last modified: 2023/12/15 15:35 by iustina.caramida
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0