Archivi tag: one-way

Modificare l’encryption method delle password utente su CentOS

Premessa

In questo blog ho più volte parlato di digest, di algoritmi di cifratura one-way e compagnia bella. Una cosa è chiara: MD5 non è la scelta migliore da fare quando si parla di cifratura delle password. Infatti, la sua naturale evoluzione, ovvero SHA, presenta una maggiore robustezza (aka resistenza debole e forte alle collisioni), dovuta anche alle dimensioni del digest che genera. Proprio per questo motivo, sono solito abilitare sui miei server l’algoritmo SHA512 per la cifratura delle password utente.

sha, md5, one-way, sha512, passwd, shadow, digest, centos

SHA512 su CentOS

Sostituire MD5 con SHA512 su CentOS è sicuramente banale. Il primo step consiste nell’identificare il tipo di cifratura attualmente utilizzato dal nostro sistema:

[root@host ~]# authconfig --test | grep hashing

Se l’output è simile al seguente:

password hashing algorithm is md5

significa che stiamo utilizzando MD5. Per sostituirlo con SHA512 basta digitare (da utente root):

[root@host ~]# authconfig --passalgo=sha512 --update

L’ultimo step consiste nell’aggiornare le password degli utenti. In questo caso potete fare 2 scelte:

1) aggiornare voi le password degli utenti (se le conoscete);

2) richiedere all’utente l’aggiornamento delle password al prossimo login.

Nel primo caso è sufficiente lanciare il comando:

[root@host ~]# passwd <nomeutente>

mentre, per forzare il cambio password da parte dell’utente occorre digitare:

[root@host ~]# chage -d 0 <nomeutente>

Enjoy.

Rainbow tables gratuite

Al giorno d’oggi, il salvataggio di dati sensibili (ad esempio le password), avviene utilizzando dei metodi di cifratura one-way (ovvero non reversibili), che implicano la creazione di un opportuno digest. Ciò significa che tali informazioni non vengono salvate in chiaro, ma assumono la forma di una sequenza di lettere (maiuscole e minuscole), numeri e caratteri speciali, che rappresentano proprio il suddetto digest.

hashing.png

Esempi di algoritmi di cifratura di questo tipo sono MD5 ed SHA nelle sue varianti (ad esempio SHA-1, SHA-128, SHA-256, SHA-512, ecc.). Il tallone di Achille di questa tipologia di algoritimi consiste nel fatto che generano digest di lunghezza finita, mentre le password possono avere (almeno teoricamente), lunghezza infinita. Eego, per il principio dei cassetti, vi saranno almeno due password diverse aventi lo stesso digest (in questo caso si parla di collisione).

Dopo questa breve premessa, cerchiamo di capire cosa sono le rainbow tables. Esse possono essere definite come una sorta di elenco di “parole” con il relativo digest. Ad esempio, una entry della rainbow table per la parola “casa” potrebbe contenere un digest “preconfezionato” mediante MD5, uno generato attraverso SHA-1 e via dicendo. In questo modo, verrà effettuato un confronto tra il digest della password che si vuole crackare ed il digest preconfezionato, alla ricerca di una corrispondenza.

Un tool che utilizza la suddetta metodologia è Ophcrack, usato soprattutto per crackare le password di Windows (sia LANMAN che NTLM). Purtroppo, però, l’elenco completo delle password (specialmente NTLM) è a pagamento. Vi consiglio dunque di consultare il seguente sito:

http://www.freerainbowtables.com/it/

in cui sono presenti delle rainbow tables gratuite suddivise per algoritmo di cifratura.

Fatene buon uso.

A presto.

HMAC

In questo post abbiamo visto cosa si intende per MAC (Message Authentication Code) e come esso venga realizzato mediante alcune tecniche HASH. Adesso ci soffermeremo sul progetto HMAC, il cui scopo è quello di consentire l’uso di un qualunque algoritmo di cifratura one-way per l’autenticazione dei messaggi.

Ma perchè utilizzare algoritmi HASH con scopi di autenticazione di messaggio? Perchè sono ottimizzati per la loro esecuzione a livello software e sono facilmente reperibili su Internet sottoforma di librerie. Nonostante ciò, essi presentano una limitazione, ovvero non utilizzano una chiave segreta e quindi non possono essere direttamente utilizzati nell’ambito del MAC.

Ecco allora che proprio per sopperire a tale limitazione viene realizzato il progetto HMAC. Esso, in sintesi, si prefigge 5 obiettivi, ovvero:

1) utilizzare, senza procedere con la loro modifica, le funzioni HASH già esistenti (soprattutto quelle caratterizzate da buone prestazioni software);

2) sostituire facilmente, in caso di necessità, la funzione HASH utilizzata con un’altra che prevede migliori prestazioni ed una maggiore robustezza;

3) preservare le prestazioni originarie HASH ;

4) gestire facilmente le chiavi segrete;

5) garantire un elevato livello di sicurezza, anche grazie alle caratteristiche intrinseche dell’algoritmo di cifratura one-way utilizzato.

I primi due punti sono garantiti dall’HMAC, poichè esso vede la funzione HASH come una scatola nera. In questo modo, anche nel caso in cui la sicurezza della funzione di cifratura fosse compromessa, la si potrebbe sostituire facilmente.

Inoltre, il meccanismo HMAC può considerarsi sicuro nel momento in cui l’algoritmo di cifratura one-way è sicuro.

Vediamo adesso qual è il funzionamento complessivo di HMAC:

HMAC.JPG

dove:

1) il blocco “hash” rappresenta la funzione hash contenuta (ad esempio MD5);

2) M rappresenta il messaggio in ingresso ad HMAC;

3) L rappresenta il numero di blocchi in cui è stato suddiviso il messaggio M;

4) Yi rappresenta l’i-esimo blocco di M, con 0 <= i <= (L-1)

5) b è il numero di bit di un blocco;

6) n è la lunghezza del codice HASH prodotto dalla funzione di cifratura one-way contenuta;

7) K è la chiave segreta: se la lunghezza della chiave è maggiore di b, allora essa verrà data in pasto alla funzione HASH per generare il digest di n bit; la lunghezza consigliata è >= n.

8) K+ è la chiave completata con una serie di zeri a sinistra (padding) in modo da raggiungere la lunghezza minima indispensabile, ovvero b bit;

9) ipad è pari a 00110110 (36 in hex) ripetuto b/8 volte (se ad esempio b=16 avrò 0011011000110110, ovvero 00110110 ripetuto due volte);

10) opad è pari a 01011100 (5C in hex) ripetuto b/8 volte;

Il byte che identifica opad ed ipad viene ripetuto b/8 volte poichè non è possibile “xorare” sequenze di bit di lunghezza diversa.

Ecco, nello specifico, le operazioni effettuate nell’ambito dell’HMAC:

1) aggiungo una serie di 0 a sinistra della chiave K per ottenere la lunghezza minima di b bit, in questo modo otterrò K+;

2) effettuo lo XOR tra K+ e l’ipad;

3) accodo al risultato dello XOR, ovvero Si, il messaggio M suddiviso in L blocchi dalla lunghezza di b bit;

4) applico la funzione HASH ad (Si || M), sfruttando un opportuno vettore di inizializzazione IV;

5) se l’HASH generato ha dimensione inferiore a b bit effettuo uno zero-padding portando la sua lunghezza a b bit;

6) calcolo lo XOR tra K+ e l’opad, generando S0;

7) accodo ad S0 l’hash precedentemente generato e il risultato di tale operazione lo do in pasto alla funzione HASH, inizializzata mediante il cosiddetto IV;

8) ottengo HMAC(K,M) (costituito da n bit).

Queste operazioni possono essere riassunte nella formula:

HMAC(K, M)= H[(K+ XOR opad) || H[(K+ XOR ipad || M–

Da notare che i tempi di esecuzione di HMAC sono approssimativamente uguali a quelli della funzione HASH utilizzata.

A presto.