Differences

This shows you the differences between two versions of the page.

Link to this comparison view

uso:laboratoare:laborator-08:concepts [2020/12/07 22:45]
alexandru.dima1609 [Prezentarea și securizarea datelor (encodare, criptare, hashing)]
uso:laboratoare:laborator-08:concepts [2021/11/16 09:40] (current)
liza_elena.babu [Funcționalități shell]
Line 1: Line 1:
-===== Concepte =====  
-==== Prezentarea și securizarea datelor (encodare, criptare, hashing) ====  
  
-=== Encodare ​=== +===== Concepte =====
  
-**Encodarea** este folosită când dorim să prezentăm o serie de date sub altă formă. De exemplucând există caractere neprintabile în datele noastrenu 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.+^ Comandă ​ ^ Descriere scurtă ​      ^ 
 +**''​cat''​** | afișare conținut fișier | 
 +| **''​seq''​** | generare secvență de numere | 
 +| **''​grep''​** | extrage linii care conțin ​anumită expresie regulată 
 +| **''​cut''​** | extragere anumite coloane | 
 +| **''​sed''​** | filtru de text avansatfolosit pentru substituții | 
 +| **''​wc''​** | contorizare număr de liniicuvinte sau caractere | 
 +| **''​head''​** | afișare primelor linii sau caractere | 
 +**''​tail''​** | afișare a ultimelor linii sau caractere | 
 +| **''​for''​** | parcurgere listă ​de elemente pentru aplicarea ​de comenzi ​pentru ​fiecare element în parte | 
 +| **''​if''​** | condiție ​de execuție a unor comenzi | 
 +| **''​$(comm)''​** | expandarea unei comenzi (//command expansion//​) ​înlocuirea cu output-ul comenzii | 
 +| **''​comm1 | comm2''​** | legarea a două comenzi: output-ul primei comenzi devine input pentru cea de-a doua comandă | 
 +| **''​$var''​ sau ''​${var}''​** | valoarea variabilei ''​var''​ | 
 +| **''​${#​var}''​** | lungimea valorii variabilei ''​var''​ (în caractere) | 
 +| **''​${var:​2:​3}''​** | un subșir al valorii variabilei ''​var'': ​de la indexul ''​2''​ se extrag ''​3'' ​caractere ​|
  
-<​note> ​ 
-Este important de precizat faptul că encodarea **nu ascunde/​securizează** informații,​ ci doar le prezintă sub o altă formă. ​ 
-</​note> ​ 
  
-{{ :​uso:​laboratoare:​new:10-sec:​image_base64.jpg?500 |}}+Pentru acest laborator vom folosi comenzi și noțiuni prezentate în laboratoarele de până acum în special laboratorul trecut ([[:​uso:​laboratoare:​laborator-07]]). Vor fi puține comenzi nou introduse; cel mai mult ne va interesa cum, dându-se o situație practică, vom putea folosi shell-ul pentru automatizare.
  
-=== Criptarea === +**Automatizarea sarcinilor** se referă la delegarea / degrevarea acțiunilor utilizatorilor către programe în sistemul de calcul. Un program va face automat, de sine stătător, acțiuni pe care le-ar face utilizatorul,​ rezultând în timp mai puțin consumat de utilizator.
  
-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ționatpoate asculta ce vorbesc Alice și Bob și va și înțelege mesajele deoarece ele sunt transmise în clar+Acțiunile ​care sunt candidate pentru automatizare sunt în general acțiuni repetitivenu foarte simple ​și neinteractive. Automatizarea acestora ​va elibera utilizator de la executarea repetată, plictisitoare,​ manuală a acestora.
  
-{{ :​uso:​laboratoare:​new:​10-sec:​image_trudy.jpg?​500 |}}+==== Perspective pentru automatizare ====
  
-**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**. ​+Automatizarea sarcinilor urmărește eficiență, în special temporală. Cu cât face mai rapid acțiuni repetitive, cu atât este mai bine. Acțiunile repetitive necesită interacțiune minimă cu utilizatorulpentru a eficientiza timpul
  
-<​note>​  +Când automatizăm,​ folosim scripting și funcționalități existente. Un principiu esențial al automatizării este //don't repeat yourself// (nu reinventăm roata). Dacă există comenzi sau funcționalități existente, le folosim pe aceleaAltfel spus, urmărim atât eficiența execuției cât și eficiența dezvoltării.
-**Criptarea** presupune ascunderea/securizarea datelor într-o manieră recuperabilă. Adică ele vor putea fi ulterior **decriptate** +
-</​note> ​+
  
-=== Hashing === +Eficiența execuției o putem realiza nu doar prin scripting, ci și prin acțiuni precum: 
 +  * folosirea de scurtături de taste 
 +  * folosirea funcționalităților de tipul //command completion//​ sau //history search// 
 +  * folosirea de alias-uri de comenzi 
 +  * folosirea de șabloane: //​globbing//​ sau expresii regulate (//regular expressions//​)
  
-**Hash-ul** este o funcție [[https://​en.wikipedia.org/​wiki/​One-way_function|one-way]]. Ea primește un input oricât de mare (1 byteun 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șhash. Mai mult, un singur bit schimbat în input va genera un output complet diferit. Exemple de algoritmi de hashing: md5 (învechit),​ SHA-1SHA-256+Atunci când folosim scripting în shellne folosim ​de funcționalitățexistente ale shell-uluipe care le vom descrie mai jos.
  
-<​note>​  +==== Scripting ====
-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.  +
-</​note> ​+
  
-{{ :​uso:​laboratoare:​new:​10-sec:lab10_hash1.png?500 |}}+Scripting presupune folosirea unui limbaj interpretat (numit limbaj de scripting). Acesta poate fi un limbaj precum Python, Perl sau Ruby sau poate fi chiar shell-ul CLI (interpretorul de comenzi). Limbajele de scripting au avantajul **dezvoltării rapide**adăugăm și testăm rapid funcționalități noi.
  
-==== Stocarea parolelor ==== +Shell scripting are avantajul folosirii comenzilor existente în shell (comenzi de lucru cu fișiere, cu procese, comenzi de filtrare de text). Pentru acțiuni rapide (de tipul //​quick'​n'​dirty//​),​ shell scripting este o soluție foarte bună. Atunci când avem prelucrări numerice sau prelucrări de șiruri, shell scripting poate fi insuficient și este indicat să apelăm la un limbaj de scripting mai complet, precum Python, Ruby sau Perl.
  
-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ține acces la baza de date respectivă, nu doar că obține acces la toate conturile, ci ș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ă**. ​+==== Funcționalități shell ====
  
-^ User ^ Password ^  +Funcționalitățile shell-ului sunt folosite în eficiența rulării comenzilor și în automatizare. Le-am folosit și amintit pe parcursul ultimelor laboratoare,​ în special în laboratorul trecut. Astfel de funcționalități sunt: 
-| Mihai | mereverzi |  +  * redirectarea comenzilor în fișiere, folosind operatorii de redirectare:​ ''​%%>​%%'',​ ''​%%<​%%'',​ ''​%%>>​%%''​ 
-Radu | usoemisto |  +  * redirectarea ieșirii unei comenzi către intrarea altei comenzi: operatorul ''​%%|%%''​ (//pipe//) 
-| Andrei | usoemehmateemisto | +  * variabile shell 
 +  * escaping folosind //​backslash//,​ ghilimele sau apostrofuri
  
-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. +Pe parcursul acestui laborator vom folosi funcțioalități ale shell-ului care sunt în special folosite în shell scripting:​ 
 +  ​expresii regulate 
 +  ​argumente ​în linia de comandă 
 +  * comenzi interne shell pentru controlul fluxului: ''​if''​''​for'',​ ''​while''​
  
-^ User ^ Password ^  +==== Automatizarea prin shell scripting ====
-| 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 mulțime de corespondențe ''​(hash_mesaj) ​-> (mesaj)''​. Pentru a sparge ​un hashputem folosi dicționare mari online precum [[https://​crackstation.net/​|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ă. +Automatizarea prin shell scripting presupuneîn mod uzual**secvență de comenzi**. Aceste comenzi sunt adăugate într-un script unde vor fi rulate la comunfără a fi nevoie de rularea manuală a fiecărei comenzi.
  
-{{ :​uso:​laboratoare:​new:​10-sec:​image_crack.png?800 |}}+Pentru a configura rulare unei secvențe de comenzi putem condiționa rularea scriptului folosind **variabile sau argumente în linia de comandă**. Acestea pot genera un comportament diferit al scriptului în funcție de valorile lor.
  
-Pentru ​baza de date de mai susparola lui Mihai a putut fi spartă, dar cea a lui Andrei nuAndrei a avut o parola mai lungă, dar acest lucru nu asigură neapărat siguranța ei+Pe baza variabilelor,​ argumentelor din linia de comanda sau datelor ​de intrareun script poate lua **decizii condiționate**Verificarea unei condiții poate duce la un comportament sau altul.
  
-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 +În rularea ​unui script adesea vom dori ca o acțiune să țintească mai multe fișiere sau procese sau șiruri. Pentru ​aceastavom urmări folosirea ​de **bucle pentru parcurgerea ​de liste de elemente**.
- +
-^  ^ Salt ^ Password ^  +
-| Mihai | dfd454ddf | f98ad20d2f42dcd4e53a4d1f40f9c1a5 |  +
- +
-Pentru ​Mihai  este: Hash(dfd454ddfmereverzi).  +
- +
-{{ :​uso:​laboratoare:​new:​10-sec:​image_crack_2.png?​800 |}} +
- +
-==== 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 [[https://​ro.wikipedia.org/​wiki/​HTTPS|aici]]. Funcționarea lui este asemănătoare cu ce am descris mai sus la SSH.  +
- +
-{{ :​uso:​laboratoare:​new:​10-sec:​image_https.png?500 |}}+
  
 +Comenzile folosite pot primi ca argument sau la intrarea standard ieșirea altor comenzi. În shell scripting folosim funcționalități de înlănțuire a comenzilor precum **//command expansion// sau //​pipe-uri//​** ducând la rezultate mai complexe.
  
uso/laboratoare/laborator-08/concepts.1607373932.txt.gz · Last modified: 2020/12/07 22:45 by alexandru.dima1609
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