31
Programmazione avanzata Java e C Sicurezza

Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

  • Upload
    votu

  • View
    221

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Programmazione avanzata Java e C

Sicurezza

Page 2: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

É risaputo che le password sono, generalmente, una delle parti più sensibili di un sito, nonchè una delle più critiche di un database.

Per garantire sicurezza e fiducia agli utenti, esse vanno protette.

Spesso si sente parlare di leaks (fuga di informazioni) da siti vulnerabili, di informazioni sensibili, tra cui anche le già citate password.

Page 3: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Obiettivo di queste slide è di fornire delle basi su alcune delle tecniche utilizzate per rendere "irriconoscibile" la password.

Una delle tecniche più famose, che sarà protagonista di queste slide, si basa sull'utilizzo degli algoritmi di Hashing.

Se la password è “canebagnato12” o “pippopippo123” allora un attacco a forza bruta impiegherà non più di qualche ora per indovinare la password.

Page 4: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Le funzioni di hash, sono funzioni matematiche oneway che prendono un valore e lo trasformano in un altro valore.

Page 5: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Gli algoritmi di hashing sono degli algoritmi che, dato in input un testo di qualsiasi lunghezza, restituiscono un altra frase di lunghezza fissa.

Essi, generalmente, vengono utilizzati per determinare l'integrità di dati di una cerca importanza.

Page 6: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Facciamo un esempio: abbiamo un testo molto lungo che vogliamo inviare ad un nostro amico; glielo inviamo e vogliamo verificare che il testo sia identico a quello di partenza. Otteniamo l'hash del testo di partenza e quello di arrivo, e la loro coincidenza determinerà l'integrità del testo.

Il motivo principale per cui si usano gli algoritmi di hashing al posto di algoritmi crittografici, è relativo all'irreversibilità dei primi, ovvero non è possibile determinare il testo originale.

Se qualcuno pensa che una funzione di hash è una funzione di crittografia, non sa di cosa sta parlando.

Page 7: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto che tutte le funzioni di hash sia anche un algoritmo di crittografia.

Eviterei di usare la parola crittografia… perché lo scopo della crittografia è avere un sistema sicuro per lo scambio di informazioni che permetta ai legittimi interlocutori di mettere in chiaro il testo.

Le funzioni di secure hashing non hanno questo obiettivo. Una volta offuscato, il dato resta offuscato e l’unico modo di metterlo in chiaro è un attacco di forza bruta o con dizionario.

Page 8: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

L’attaccante ha una serie di hash, che non sono reversibili per definizione.

Nel suo arsenale d’attacco di saranno un bel po’ di dizionari contenente password di uso comune alle quali verrà applicato l’algoritmo di hash per vedere se il valore offuscato è nel database appena trafugato.

Page 9: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Il particolare algorito di hash viene desunto dalla lunghezza dell’hash stesso.

Quindi è un’informazione che dobbiamo dare per scontata sia in mano a chi ci attacca.

Terminati i dizionari, si parte enumerando tutte le possibili combinazioni di lettere e numeri. E qui è solo una questione di tempo (tranne in un caso).

Page 10: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Proprietà di un Algoritmo di Hashing:ü Digest (Hash): valore ottenuto dall'hashing, che noi nella

guida chiameremo "Hash" per praticità.ü Collision (Collisione): quando due stringhe in input

hanno lo stesso Hash. Questo succede perchè abbiamo un numero infinito di lettere nel testo, mentre un numero limitato di caratteri nell'Hash.

ü Collision Rate (Tasso di collisione) : La frequenza di collisioni in un algoritmo hashing. Più piccola è la lunghezza dell'Hash, maggiore sarà il numero di collisioni.

ü Salt (Sale): Una stringa creata random che si andrà ad aggiungere alla nostra password per renderla più sicura.

Page 11: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Metodi di "Rottura" (crash) Hash (I peggior nemici degli Hash)

Prima di parlare dei metodi di rottura, vorrei farvi notare una cosa, che nell'Hashing una velocità lenta è una cosa positiva, perchè richiede più tempo di calcolo, e leggendo i vari metodi, capirete il perchè.Quelli sotto elencati, sono i metodi con i quali è possibile trovare la stringa originaria attraverso l'Hash:

Page 12: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Brute ForceProva tutte le possibili combinazioni di caratteri data una certa lunghezza. Si trova l'Hash di ogni singola combinazione e si controlla con l'Hash che dobbiamo risolvere. E' un metodo abbastanza lento poichè bisogna valutare tutte le combinazioni possibili, e la sua efficacia dipende dalla macchina in cui ci si trova.

Page 13: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

DirectionarySimile al Brute Force, differenzia solo per le parole usate: non sono possibili tutte le combinazioni di caratteri ma solo parole ben definite e comuni, generalmente contenute in un file di testo o in un database.

Hash TablesConsiste nel creare una tabella dove ogni riga contiene una parola (ovvero la possibile password) e il suo relativo Hash, così che sia possibile la corrispondenza del nostro Hash, ovviamente solo ve ne è una.

Page 14: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Rainbow TablesMolte volte vengono scambiate per le Hash Tables ma il loro utilizzo è nettamente più complesso. Avrei il piacere di spiegarle più dettagliatamente in un'altra guida.

Page 15: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Gli algoritmi Hashing più usatiMD5: Restituisce un Hash da 128 bit ( 32 caratteri ) di caratteri

esadecimali, è uno dei più utilizzati ma anche quello più sconsigliato perchè molto veloce (quindi più facile da cracckare con bruteforce) e anche perchè molto corto e quindi maggior probabilità che si presentino collisioni.

SHA: Secure Hashing Algorithm, è una famiglia di vari algoritmi di hashing. Venne creato dal NIST , National Institute of Standards and Technology. Di questa famiglia abbiamo attualmente 3 funzioni:

SHA1: Progettato dall'NSA. Restituisce un hash da 160 bit ( 40 caratteri) di caratteri esadecimali. Ma come MD5 è sempre molto utilizzato e molto veloce, quindi il suo uso viene sconsigliato.

Page 16: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

SHA2: E' più robusto di SHA1. Comprende SHA-256 ( 64 caratteri), SHA-512 (128 caratteri). Data la sua lunghezza maggiore, il numero di collissioni diminuisce di molto, ma comunque rimane un algoritmo molto "veloce" e ciò lo penalizza di tanto. Da notare che esiste anche SHA-384 ( 96 caratteri) e SHA-224 (56 caratteri).

SHA3: Comprende SHA3-224, SHA3-256, SHA3-384, SHA3-512, SHAKE128, SHAKE256, il difetto di questo Hash è che ha una velocità di calcolo molto elevata.

Bcrypt : Basato su Blowfish, attualmente considerato uno dei miglior algoritmi di Hashing, ogni suo hash è preceduto da "$2a$" o "$2b$" o "$2y$".

Scrypt : E' simile a Bcrypt ma più sicuro per il suo tempo di calcolo molto elevato.

Whirlpool : Restituisce un Hash da 512 bit, anch'esso è un algoritmo molto buono.

Page 17: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Rafforzare Hash con Salt e PepperPer combattere i peggior nemici degli Hash, si fa ricorso al

Salting e al Pepper (sale e pepe), questo metodo è molto utile, poichè nel caso di password uguali, avremo altrettanti Hash uguali, e ciò non sarà positivo alla nostra sicurezza delle password e alla loro "unicità".

Page 18: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Il Salt è una stringa random che viene aggiunta alla password per poi azionare l'algoritmo di Hashing sulla password+salt, così da renderla unica e aumentandone la lunghezza.

E' sconsigliato l'uso di un Salt corto o di un Salt statico, ovvero uguale per tutte le password, di solito.E' sconsigliato l'utilizzo di informazioni date dall'utente come Salt, per non far restituire lo stesso Hash da due database differenti.

Page 19: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Non c'è bisogno che il Salt sia segreto,perchè le Rainbow Table, bruteforce ecc diventano inutilizzabili. Visto che si dovrebbero calcolare tutte le possibili password per ogni Salt, quando senza Salt trovando tutte le combinazioni potevi avere già tutte le password del database.

Page 20: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Il Pepper è una chiave segreta (key) che serve per trasformare un hash in HMAC (in maniera migliore, è un valore che serve per trasformare un Hash in MAC, e ci sono vari metodi per farlo, uno dei migliori è HMAC).

L'HMAC keyed-Hash Message Authentication Code è un'algoritmo di hashing che però utilizza una chiave segreta.

E quindi per preservare l'integrità di un messaggio è necessaria una chiave(senza la chiave non può essere riprodotto l'hash). Ovviamente il Pepper è utile quando il nostro utente malintenzionato non conosca la chiave.

Page 21: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Alcuni programmatori, hanno l'abitudine di usare più volte md5 e sha1 sopra una password, es: md5(md5(sha1(password))) .

Io non consiglio metodi del genere, prima di tutto, diversamente da come si pensi, i benefici ottenuti tramite questi algoritmi sono davvero pochi, e secondo è inutile sprecare tempo di calcolo quando esistono algoritmi migliori e pensati meglio per questo genere di lavoro, e questo metodo risulta efficace quando il nostro malintenzionato non conosca l'algoritmo di hashing, ma nel caso il nostro source sia opensource, questo metodo perde tutta la sua efficacia.

Page 22: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Annidamento di HashUno dei metodi più efficaci per rafforzare i nostri Hash, è

quello di annidarli (nested hash), ovvero di ricalcolarli per un dato numero di volte, riutilizzando comunque la password e il salt in modo adeguato.Come abbiamo detto prima, usare una tecnica come il riutilizzo dello stesso algoritmo, non migliora di tanto la sicurezza del nostro hash, tuttavia risalire alla password diventa molto più complesso per il notevole aumento del tempo di calcolo.

Page 23: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Se applicato correttamente non vi è neanche un aumento di collisioni.

Un esempio di algoritmo di annidamento è PBKDF2.

SHA1 e SHA2 e SHA3 sono algoritmi buoni, ma come ho detto prima, l'unico difetto che hanno è quello di essere molto veloci; attraverso PBKDF2 il tempo di calcolo aumenta di gran lunga: la loro efficacia aumenta.

Generalmente viene comunque preferito l'uso di Bcryptrispetto all'annidamento.

Page 24: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Esiste una regola aurea nel mondo dell’IT security.

Mai, mai, mai

inventarsi un metodo di cifratura fatto in casa.

Gli algoritmi in uso sono stati elaborati da scienziati con profonde basi matematiche e sono stati rivisti più e più volte da comitati fatti di matematici ed esperti di criptoanalisi..

Page 25: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

DefCon 1le tue password sono memorizzate in chiaro

Non ci sono tante giustificazioni nel salvare la password di un utente in chiaro se non una serafica ignoranza. Essendo routine già pronte ed il web pieno zeppo di esempi di come usare una cifratura X ad una password, volerla salvare in chiaro è il semplice mix tra menefreghismo ed ignoranza.

Ingiustificabile.

Page 26: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Come può un utente scoprire se ha dato la password in mano ad un cialtrone siffatto?

Prova a seguire il link del reset password, se l’applicazione ti fa scadere la password e ti da un link per fare il reset password allora hai qualche speranza.

Se ti arriva una mail con la password in chiaro nel corpo del testo, cambia fornitore del servizio

Page 27: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

DefCon 2le tue password sono offuscate senza salt

Allora aggiungere un salt random nel momento in cui viene applicata la funzione di hash alla password è sicuramente un’ottima cosa.

Perturba l’input quanto basta per rendere un attacco a dizionario inutile e un attacco a forza bruta veramente difficile, visto che devi attaccare sia la password che il salt quindi le combinazioni lievitano.

Page 28: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

Certo è, che se il salt è nello stesso DB delle password e quindi finisce in mano all’attaccante, aggiungerlo non rende la tua ricetta molto più gustosa, anzi.

Il salt va protetto e memorizzato in un luogo diverso dall’hash.

Se l’attaccante ha in mano anche l’hash allora il tuo livello di nervosismo è legato all’algoritmo di cifratura utilizzato.

Se l’attaccante non ha in mano l’hash, diciamo che ragionevolmente puoi stare un po’ più tranquillo.

Page 29: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

DefCon 3 le tue password sono offuscate con SHA1 o MD5 con il

saltDunque MD5 e SHA1 erano il top… forse una decina d’anni

fa. Il problema è che lo sviluppatore medio ha sentito questi

nomi all’Università e li ha associati al nome password e non si è mai evoluto.

Page 30: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

MessageDigest md = MessageDigest.getInstance("SHA-1"); String text = ” Precipitevolissimevolmente";md.update(text.getBytes("UTF-8")); byte[] digest = md.digest(); // SHA-256 MessageDigest md = MessageDigest.getInstance("SHA-256"); String text = " Precipitevolissimevolmente ";md.update(text.getBytes("UTF-8")); byte[] digest = md.digest(); // SHA-512 MessageDigest md = MessageDigest.getInstance("SHA-512"); String text = " Precipitevolissimevolmente "; md.update(text.getBytes("UTF-8")); byte[] digest = md.digest();

Page 31: Programmazione avanzata Java e Capollo.ing.unibs.it/fip/wp-content/uploads/2015/09/20171027... · Ci sono algoritmi di crittografia che sono anche funzioni di hash, ma non è detto

DefCon 4Le tue password sono offuscate con SHA256 o SHA512

con il salt

Ok, ci sei quasi. Il metodo di cifratura è quasi quello ottimale.

Per un attaccante un attacco a dizionario è sempre possibile nel caso di password senza vincoli di complessità e un attacco di forza bruta se hai usato un salt è veramente complesso.

Puoi stare quasi tranquillo.