class: center, middle # SECURING DATA --- - Come mantenere memorizzate le password su server? -- - Tenere username e password in chiaro ? -- - Meglio di no ! --- - Potrebbe capitare un data breach, ovvero che con un attacco hack venga carpito l'intero db con login e password -- - con tecniche di SQL injection, exploit, credenziali rubate, bug, server esposto -- - Oppure un data leak (fuga di dati), puo' capitare per un errore o per incompetenza -- - backup pubblico, database aperto, log con password, permessi impostati male -- - in tutti questi casi la coppia username password di ogni utente sarebbe disponibile --- - Le persone tendono ad usare lo stesso username e password in molteplici siti -- - partirebbe un credential stuffing -- - ovvero un attacco automatico in cui si usano gli username/password in tanti altri servizi quali mail, social, banche, cloud --- # HASH -- - Non si memorizza la password ma "l'hash" della password -- - Un esempio di hash è la somma del codice ascii di ogni lettera, chiamiamo questa funzione DUMMY_HASH() -- - Es: DUMMY_HASH("ciao") = 99 + 105 + 97 + 111 = 412 -- - Dalla somma finale 412 non è possibile facilmente risalire alla parola iniziale -- - (in questo caso non è propriamente vero, ma datemelo per buono) --- - L'hash viene memorizzato su server -- - Il viene calcolato l'hash della password inserita dall'utente e viene confrontato con l'hash memorizzato -- - se sono uguali vuol dire che l'utente ha inserito la password corretta --- - usare la somma dei valori ascii non è la strada corretta -- - è facile avere collisioni, diverse password possono generare lo stesso hash -- - ricordando che: DUMMY_HASH("ciao") = 99 + 105 + 97 + 111 = 412 -- - abbiamo che: DUMMY_HASH("bibo") = 98 + 105 + 98 + 111 = 412 -- - quindi DUMMY_HASH("ciao") = DUMMY_HASH("bibo") -- - inserendo la password "bibo", questa viene accettata --- - un hash viene calcolato con altri algoritmi -- - regola 1: la funzione hash non deve essere reversibile. -- - Non deve essere possibile risalire ad una password che genera quell'hash -- - regola 2: la funzione hash deve avere una distribusione uniforme -- - parole simili devono avere hash totalmente diversi -- - regola 3: bassa probabilità di collisione -- - difficile trovare due parole con lo stesso hash -- - regola 4: l'hash deve essere di lunghezza costante --- - Dictionary attack (o anche brute force) è sempre possibile -- - Un attacker puo' usare le Rainbow table -- - ovvero una tabella gigantesca di password e hash value --- - se due utenti hanno la stessa password cosa succede ? -- - se l'hash calcolato è sempre lo stesso, abbiamo un problema di sicurezza -- - si usa il "salting": -- - in input si usa oltre che alla password un altro numero chiamato salt (casuale) -- - casuale vero, si usa CSPRNG non rand() -- - Cryptographically Secure Pseudo-Random Number Generator -- - basato su entropia vera (kernel, rumore, eventi di sistema) -- - rand() va bene per generare un world in minecraft, non va bene per la crittografia --- - usando salt diversi gli hash calcolati per una stessa password saranno diversi. -- - Il salt viene memorizzato in chiaro nella stessa password -- - il salt ha anche il beneficio di rompere le rainbow table -- - md5, sha, sha3 ? Nessuno di questi ! -- - per l'hash si usa password_hash() con PASSWORD_ARGON2ID --- - un hash è nel formato ad esempio: ``` $argon2id$v=19$m=65536,t=4,p=2$3q2+7w==$/l3gP2wK+fGvWcZLzK1CzQ== ``` -- - $argon2id$ → tipo di algoritmo -- - v=19 → versione dell’algoritmo -- - m=65536,t=4,p=2 → parametri: -- - m = memoria in KiB (le GPU hanno molti core ma la ram è preziosa, tenere questo parametro alto) -- - t = iterazioni -- - p = parallelismo (thread) -- - 3q2+7w== → salt (base64) -- - /l3gP2wK+fGvWcZLzK1CzQ== → hash vero e proprio (base64) --- # BREVE DIGRESSIONE (?) SU BASE64 -- - Base64 non è cifratura, è solo codifica. -- - Serve a trasformare byte binari in testo leggibile (ASCII), utile per email, HTTP, JSON. -- - I caratteri ammessi sono: lettere maiuscole e minuscole, numeri, il simbolo "+" ed il simbolo "/", 64 in tutto --- - Esempio: supponiamo di voler codificare la parola "CIAO" -- - Ascii code della stringa ``` C = 67 = 01000011 I = 73 = 01001001 A = 65 = 01000001 O = 79 = 01001111 ``` -- - i bit concatenati diventano ``` 01000011010010010100000101001111 ``` -- - Raggruppamento in Base64 (6 bit alla volta) ``` 010000 110100 100101 000001 010011 110000 Valori decimali sono: 010000 = 16 110100 = 52 100101 = 37 000001 = 1 010011 = 19 110000 = 48 ``` --- - tabella Base64 è: ``` 0–25 → A–Z 26–51 → a–z 52–61 → 0–9 62 → + 63 → / ``` -- - mappatura da valori a simboli ``` 16 → Q 52 → 0 37 → l 1 → B 19 → T 48 → w ``` -- - Risultato: Q0lBTw -- - Fine digressione su Base64 --- - Algoritmi di hash -- - $2y$ : bcrypt versione moderna di $2a$ -- - $2a$ : bcrypt vecchia versione, non più consigliata -- - $argon2id$ : Argon2id memory-hard, ottimo per password -- - $pbkdf2$ : PBKDF2 iterazioni configurabili, legacy in alcuni sistemi --- - Mai capitato che un sito ti mandi le password per mail ? -- - non puo', a meno che non abbia le pass in chiaro. -- - Evitarlo ! -- - non in tutto il mondo è obbligatorio rivelare un attacco in cui le password sono state compromesse --- # CRITTOGRAFIA -- - Durante la seconda guerra mondiale, si usava il "cifrario a libro" -- - mittente e destinatario condividono lo stesso libro (che doveva rimanere segreto) -- - vengono trasmesse sequenze di numeri che individuano parole all'interno del libro -- - es: 45-3-12 ovvero pagina 45, riga 3, parola 12 -- - 45-3-12-72-10-1-88-4-3 -> "attaccare a nord" -- - sistema molto fragile, se il nemico scopre il libro sei fottuto --- - Encode: testo in chiaro -> testo cifrato -- - Decode: testo cifrato -> testo in chiaro -- - Cifratori storici: -- - Cifrario di cesare: in pratica è rot n ha solo 25 chiavi possibili. Lo si decodifica anche a mano. -- - Enigma machine: usata dai tedeschi nella seconda guerra mondiale. In pratica fa una sostituzione diversa ogni volta -- - E' crollata per errori umani (messaggi prevedibili come heil hitler), difetti strutturali, lavoro matematico di Alan Turing --- - Oggi gli algoritmi sono pubblici e ben conosciuti e testati. -- - Le chiavi, al contrario, sono segrete e personali -- - Le chiavi sono semplicemente dei numeri giganti, magari visti come successione di caratteri --- # Crittografia a chiave segreta -- - anche detta a chiave simmetrica -- - la chiave deve essere conosciuta anche dal ricevente. -- - chiave e testo in chiaro vengono dati all'algoritmo che encripta -- - esempio: ROT n (il piu' conosciuto è rot 13) -- - ROT 1 : CIAO -> DJBP -- - non usare ROT 26 perche' il testo criptato è uguale a quello in chiaro (neanche ROT 52) --- - Che algoritmi di cifratura si usano adesso ? -- - AES -- - BLOWFISH -- - SERPENT -- - Sono molto complessi e ben documentati. -- - Il fatto di conoscere l'algoritmo non compromette la sicurezza. -- - Meglio fidarsi sulla matematica piuttosto che sulla segretezza di un algoritmo. --- # Crittografia a chiave pubblica -- - anche chiamata a chiave asimmetrica -- - non sempre è possibile stabilire una password segreta tra due soggetti -- - Come posso scambiarmi dati criptati con Amazon o Google ? -- - come è possibile scambiarsi una password in maniera sicura ? --- - Algoritmi Diffie-hellman, MQV, RSA... -- - ognuno ha 2 chiavi ! una pubblica e una privata -- - chi vuole trasmettere dati usa la chiave pubblica del ricevente per criptarli -- - la chiave privata del ricevente è l'unica chiave che puo' aprire quel dato -- - Chi trasmette: testo in chiaro + chiave pubblica (del ricevente) -> testo crittografato -- - Chi riceve: testo crittografato + chiave privata (del ricevente) -> testo in chiaro --- # RSA -- - usato in https (vecchio metodo) -- - pgp -- - certificati digitali -- - banche -- - smart card. --- # Diffie-Hellman -- - usato in https -- - ssh -- - vpn -- - whatsapp -- - telegram -- - si basa sulla creazione di una stessa password per ambedue i soggetti -- - ... ma in maniera che nessuno possa intercettarla! --- - siano dati i valori di g (generatore) e p (numero primo di grandi dimensioni es 1000 cifre) -- - sono dati pubblici, vengono presi da RFC o il server li invia al client durante l'handshake -- - Alice sceglie una chiave privata a e calcola la chiave pubblica A nel seguente modo -- - ALICE: A = g ^ a mod p -- - BOB sceglie anche lui una chiave privata b e calcola la chiave pubblica nel seguente modo -- - BOB: B = g ^ b mod p -- - A e B possono essere inviati via internet ognuno all'altra persona -- - Sono chiavi pubbliche, tutti le possono vedere --- - Sia Alice che bob calcolano s, ovvero la chiave di cifratura -- - Alice: s = B ^ a mod p -- - Bob: s = A ^ b mod p -- - s E' UGUALE PER AMBEDUE ! Lo dice la matematica. (s = g^(ab) mod p) -- - con la chiave identica s in possesso di ambedue si usano poi ad es. gli algoritmi AES a chiave privata --- - In realtà ora non si usa il DH ma ECDH: Elliptic Curve Diffie Hellman -- - non si usa ne' esponenziazione, ne' modulo p -- - si usa un'operazione "." di moltiplicazione scalare (somma ripetuta di punti) -- - chiave pubblica = a . G -- - dove a è la chiave privata e G è un punto generatore sulla curva ellittica -- - il risultato è un altro punto sulla curva ellittica che e' la chiave pubblica -- - tutti i punti stanno su una curva del tipo: ``` y^2 = x^3 + ax + b (mod p) ``` --- - DH richiede almeno 2048 bit per il numero primo p -- - meglio 3072 bit (ovvero 925 cifre) -- - 256 bit di EC sono circa equivalenti a 3072 bit di DH -- - 384 bit di EC sono circa equivalenti a 7680 bit di DH -- - DH classico -> p è enorme, lento, fragile -- - ECDH -> numeri piccoli, sicurezza alta --- # FIRMA DIGITALE -- - usando una chiave privata DSA, ECDSA, RSA -- - Alice vuol mandare a Bob un messaggio firmato digitalmente -- - Alice crea l'hash del messaggio -- - message -> hash -- - successivamente viene criptato l'hash con la chiave privata -- - CRYPT: hash + private key (alice) -> firma -- - Alice invia il messaggio e la firma --- - Bob riceve da Alice il messaggio e la firma -- - Calcola l'hash del messaggio -- - messaggio -> hash -- - successivamente decripta la firma usando la chiave pubblica di Alice -- - DECRYPT: chiave pubblica di Alice, firma -> hash -- - Se Bob vede che i due hash sono uguali, allora è sicuro che sia stata Alice a firmare il messaggio --- # Firma digitale per accedere ad un sito -- - forse sarà il metodo per soppiantare le password ? -- - una chiave pubblica per ogni sito web -- - il sito manda un challenge -- - l'utente deve firmarlo digitalmente -- - Se la firma è ok il sito è sicuro della tua identità --- #Encrypt in transit -- - Alice <-> Gmail <-> Bob -- - Ma Gmail vede le email di Alice e bob. -- - Lo stesso capita per tanti altri servizi es. Zoom -- - occorre End to End encryption. Sempre -- - iMessage o Whatsapp la applica (speriamo in maniera corretta) -- - E2E encryption sta diventando sempre piu' diffusa --- # Cancellazione di File -- - hard disk meccanici, ssd, chiavette usb -- - quando si cancella un file non succede molto... i sistemi operativi non cancellano i dati, semplicemente dimenticano dove sia il file -- - le parti del file eventualmente sono sovrascritte nel tempo da altri file -- - ma alcuni dati potrebbero essere ancora lì -- - Secure deletion, occorre sovrascrivere tutti i bit su disco -- - mettendo tutti i byte a 0, oppure sovrascrivere dati random, oppure pattern di 0 e 1 -- - ... anche in più passate ! --- # Full disk encryption -- - Anche chiamata "Encyption at REST" -- - I dati scritti su disco sono SEMPRE criptati, i dati in chiaro non toccano mai il metallo -- - se il device viene rubato se uno ha una buona password o biometrics i dati sono al sicuro -- - neanche smontando l'hard disk -- - se uno vuole vendere il device non deve preoccuparsi dei dati rimasti sul disco -- - se si perde la password si perdono tutti i dati --- - questa tecnologia è applicata al contrario nei "ransomware" -- - vengono criptati i dati sul tuo pc -- - generalmente chiedono un pagamento in bitcoin. --- # Quantum computing -- - un bit puo' valere 0 oppure 1 -- - un qbit vale 0 e 1 allo stesso tempo -- - i media dicono che la capacità di calcolo è esponenziale rispetto al numero di qbit utilizzati -- - ma è vero ? --- - con l'algoritmo di Groover si ottiene al massimo un vantaggio quadratico -- - una password da 16 caratteri ha uno spazio delle chiavi di 95^16 circa 2^105 -- - usando il metodo classico servono 2^105 tentativi ovvero è impossibile -- - usando il metodo quantistico (algoritmo di Groover) servono 2^52 tentativi (sempre impossibile) -- - Al momento non abbiamo nè hardware, nè software per craccare password di queste dimensioni -- - se questa tecnologia dovesse mai prendere piede (ora sembra tutta fuffa), -- - e se venisse creato il software giusto (attualmente non esiste) -- - allora, e solo allora, tutti i sistemi di crittografia discussi non avrebbero piu' valore.