Hashing e criptazione? Cos'è un valore hash, cos'è la crittografia hash e cos'è la decrittazione hash?

Hashing e crittografia

C'è un malinteso comune secondo cui hashing e crittografia sono la stessa cosa. Non lo sono. Gli hash sono irreversibili. Prendiamo il seguente esempio:

$ echo-n Password123 | md5sum
42f749ade7f9e195bf475f37a44cafcb-

Passiamo la stringa "Password123" all'algoritmo MD5 (algo) che esegue le operazioni matematiche e restituisce l'hash codificato esadecimale generato. L'unico modo per ottenere lo stesso valore di output hash è inserire algo in originale. Ci sono conflitti, ma ne possiamo discutere più tardi.

L'output della maggior parte degli algoritmi di hash è una stringa binaria di lunghezza fissa codificata esadecimalmente. Altri, come questo esempio, usano stringhe codificate base64 come output. Si noti che la lunghezza è sempre la stessa:

{SHA} uNF8eZRJ8jmr8WTjyocRJPVpe7w =
{SHA} lqdu/Zr6o2dgIER8Up1/7lcUtgw =
{SHA} qYUOwLMlDEuukA5HCT4LR1kQzco =
{SHA} MXZBCpyWJ7TTs1w2kgGJslwNwTg =
{SHA} 2sAPLaUh9Mz0bI + XxKEg7qyABe8=

TL; Dr.

La crittografia è reversibile, gli hash non


Non voglio parlare troppo di crittografia (perché quelle cose sono per i libri), ma è importante essere in grado di distinguere tra stringhe hash e stringhe crittografate. La crittografia di solito riempie la stringa per soddisfare una lunghezza specifica prima che avvenga la crittografia. Richiede anche una chiave (o password) per decrittografare. Se si utilizza una password crittografata, la stringa cambierà a seconda della lunghezza dell'input. Se vedi un mucchio di password di testo cifrato, la lunghezza varia e potresti aver a che fare con la crittografia anziché con l'hash. AES-256-CBC Esempio Stringa crittografata e testo semplice associato (con la chiave "ASDF"):

 foobar                           |   U2FsdGVkX19G + KtytNHdj6yH2AVvX26pEmtunS/PRnU = 
foobarfoobar               |   U2FsdGVkX18sPpIvN6nVh68lOUCcb3gR2fKbCCnBxog = 
foobarfoobarfoobar   |   U2FsdGVkX1/EOnUt57TCW4Rh0EdNnWX + ldatuqv2xexeaeoww0xg/EXJUe9aSUz 

$   cat   encrypted_passwords 
U2FsdGVkX19G + KtytNHdj6yH2AVvX26pEmtunS/PRnU = 
U2FsdGVkX18sPpIvN6nVh68lOUCcb3gR2fKbCCnBxog = 
U2FsdGVkX1/EOnUt57TCW4Rh0EdNnWX + lDatuQv2xEXXeAeowW0XG/EXJUe9aSUz 

$   per   i   in   `cat   encrypted_passwords`;   do   echo   $i   |   openssl   enc   -base64   -d   -aes-256-cbc   -pass   pass:asdf;   eco;   Fatto 
foobar 
foobarfoobar 
foobarfoobarfoobar 

Ora potresti pensare: probabilmente hai ragione. Tuttavia, il fatto che il materiale critico debba essere accessibile al sistema significa che essenzialmente una password principale in testo semplice si trova da qualche parte-sia come chiave RSA o password in un file, incorporato in un database, codificato in un'applicazione o password da qualche parte nella memoria. pfft, nessuno ' userà asdf come chiave per crittografare le password dei propri utenti '

Usa la stessa stringa di MD5:

 foobar                           |   3858f62230ac3c915f300c664312c63f 
foobarfoobar               |   59faa421729e846dd800dce59943bfc0 
foobarfoobarfoobar   |   1352aadab322d1a033c27964be0965db 

La password hash è tutt'altro che perfetta, anzi è un po' cattiva, ma è peggio della crittografia per quello che cerca di ottenere. Gli utenti scelgono il requisito minimo assoluto più spesso di not e possono anche utilizzarlo su più siti. Molti "hacks" non sono in realtà altro che attacchi di riutilizzo delle credenziali. Se il compromesso iniziale è l'uso della crittografia, l'unico sforzo che l'aggressore deve fare è trovare la chiave per decrittografare tutte le password. Per gli hash, dovranno fare almeno uno sforzo per decifrarli. Quando utilizzato con algoritmi moderni come sha512crypt, bcrypt, scrypt o argon2, i valori hash possono richiedere uno sforzo significativo per essere crackati.



Marinare

Aggiungere sale è aggiungere una stringa alla password prima dell'hash. Il sale di ogni hash dovrebbe essere unico e di solito selezionato in modo casuale, poiché il punto è quello di rendere lo stesso hash "password" in testo chiaro un valore diverso ogni volta. Questo rende la vita difficile per i password cracker, perché per controllare la parola "password" per ciascun utente su 1.000, ciascun utente ha un SALT unico, e devono fare il lavoro 1.000 volte-una volta per utente/SALT. Ciò significa anche che non possono usare dizionari precompilati o tabelle arcobaleno in modo efficiente (di solito...) perché richiedono un per-sale personalizzato.

I siti web a volte rovinano questo e usano il sale generico per tutti gli utenti; Questo va contro lo scopo.

Ecco gli hash SHA1 con sale aggiunto:


 b353977827f67a4ae0318f3a9447fae1c13d9d90:b8d18ca 
|___________________________________________| 
                                    hash                                     |     sale 
                                        | 
                                                                        separatore 

Il testo in chiaro di questo hash è "password". Il suo valore di sale è "b8d18ca" e utilizza SHA1 ($salt.$pass) nell'API. Ciò significa che l'algoritmo prende il testo in chiaro di password, genera salt e lo aggiunge davanti al testo in chiaro. Quando un sito web o un'applicazione tenta di verificare la tua password in futuro, prenderà la tua password in testo chiaro come input, leggerà il valore salt nell'Hash memorizzato, lo aggiungerà davanti alla password selezionata e confronterà l'Hash generato con l'Hash memorizzato. Cracking Se non si sa che parte di esso è salt, l'hash produrrà il seguente testo semplice:

b8d18capassword

Poiché l'algoritmo effettua l'input di testo semplice, salt e il valore hash generato possono rimanere trasparenti per l'utente. Al momento del cracking, se l'algoritmo è salato, dobbiamo conoscere il salato in modo da poterlo fornire quando si genera il testo semplice candidato.

Se eseguita correttamente, la salatura può rendere la cracking più richiesta di tempo. Con il sale casuale, costringi il Cracker a perdere tempo cercando di decifrare gli hash che il sale non corrisponde. Questo completa approssimativamente lo sforzo necessario per device_speed/number_of_salts, perché dobbiamo generare un candidato per ogni sale. Se il sale è statico, la matematica è la stessa... speed_of_device/1. Un altro modo di vedere questo:

 nostro   GTX   980   cracks   SHA1 ($salt.$pass)   a   3576,8   MH/s   o   3,5   miliardi   candidati   per   secondo 
La nostra   hashlist   contiene   1000   unici   sali 

3.500.000.000   /   1000   =   3.500.000   candidati   per   secondo 

Questo è tre ordini di grandezza più lento, con una perdita del 99,9%. Con il sale statico, sembra così:

 Our   GTX   980   cracks   SHA1 ($salt.$pass)   at   3576,8   MH/s   o   3,5   miliardi   candidati   per   secondo 
La nostra hashlist     contiene   1   unico   sale 
               
3.500.000.000   /   1   =   3.500.000.000   candidati   per   secondo 

Se questo non ha senso, continua a leggere, avremo un bel grafico più tardi...


Iterazione

Un altro miglioramento comune rispetto al semplice "hash questo testo semplice" è che "hash questo testo semplice, poi hash quel risultato, poi hash quel risultato" viene ripetuto migliaia di volte. Ciò consente di provare una singola password candidato quando il programma di cracking password deve eseguire migliaia di operazioni. Questo è chiamato iterazione, loop o costo variabile. Alcuni algoritmi di hash password utilizzano cicli di iterazione codificati; Altri Git. renderlo configurabile in una parte dell'Hash stesso. Ad esempio, md5crypt () utilizza MD5, incluso salt, e cicla esattamente 1000 volte. sha512crypt () utilizza sha512, include un sale e circola un numero configurabile di volte (per impostazione predefinita è 5.000).

Le iterazioni influenzano principalmente il costo del ciclo di calcolo dell'algoritmo di hash, piuttosto che il suo uso di memoria o altri fattori. Questi sono anche attacchi importanti quando si progettano ottimizzati per resistere ad alcuni tipi di tipi di hash, ma questo è troppo erbaccia per essere discusso qui.


Effetto del tipo di hash sulla velocità di cracking

Diamo un'occhiata ad alcuni esempi per dimostrare l'impatto della scelta dell'algoritmo hash, sia salato, utilizzando più iterazioni, ecc. Supponiamo che un aggressore abbia raccolto 1.000 hash di utenti provenienti da un determinato sito web infetto e voglia solo compiere un semplice attacco, testando ogni hash di password-143 milioni di password candidate.

Il tipo di hash utilizzato dal sito infetto avrà un impatto enorme sul tempo necessario per l'attaccante per passare l'attacco. Ecco un grafico (relativo, approssimativo) di quanti secondi ci vogliono per completare quell'attacco, a seconda del tipo di hash utilizzato, dove la scheda grafica standard:

Beh, questo è inutile! I tipi di hash più forti sono molto più lenti, ma i tipi più veloci sono semplicemente schiacciati fino a non avere nulla. Proviamo di nuovo con la stessa dimensione dei dati utilizzando il tempo logaritmico dell'asse X. Quando le barre si muovono da sinistra a destra, aumenteranno di 10 alla potenza:

Quindi alcuni punti principali sono: quando si vuole decifrare alcuni hash di password, il giro singolo è più facile che il giro multiplo e senza sale che aggiungere sale. Al contrario, quando alcune aziende o siti web annunciano una violazione dei dati contenenti i dati degli utenti, a) è meglio che la password sia stata hash, non solo testo semplice; b) sono preferibilmente salati, non solo hash; c) È meglio che abbiano sempre usato potenti hash salati multi-round piuttosto che solo un singolo round.



Identificare il tipo di hash

Prima di tentare di decifrare un determinato hash di password, spetta al cracker capire quale algoritmo di hash viene utilizzato per implementarlo. Identificare i tipi di hash è spesso semplice, ma non sempre. I cracker spesso fanno ipotesi fondate basate su indizi come la lunghezza e il formato dell'hash. In ultima analisi, l'unico modo per essere sicuri che la indovinazione del tipo di hash sia corretta è se l'hash è stato crackato o meno.

Alcune risorse eccellenti per questo compito sono fornite qui e qui, ed entrambe mostrano come sono gli hash comuni.

Il pacchetto "hash-identifier" (disponibile qui) è disponibile in Kali Linux per aiutare a identificare i tipi di hash sconosciuti.



Collisione

Un conflitto si verifica quando due input diversi causano lo stesso output hash. E' brutto (ovviamente). Per le password, questo potrebbe significare che probabilmente non ho rotto la password effettiva, ma poiché ho trovato un input che produce lo stesso valore hash, posso usare valori di testo semplice per ingannare il sistema a pensare che la password sia legittima.

Microsoft Office utilizza un algoritmo che è stato soggetto a conflitti per anni nella sua protezione dei documenti. Non è raro scoprire più conflitti per un singolo hash, tutti quelli che sbloccano il documento.

Una volta trovato un conflitto, l'algoritmo viene effettivamente danneggiato. Se succede una volta, è probabile che si ripeta statisticamente. L'unica cosa che ci sta fermando è il tempo e la capacità di elaborazione. Man mano che gli algoritmi diventano più robusti, generare algoritmi candidati e confrontare i risultati hash per cercarli richiede più capacità e tempo. Di conseguenza, i progettisti stanno diventando sempre più bravi a creare algoritmi meno inclini ai conflitti.


Precedente:Hashcat hardware per cracking delle password
Il prossimo:Che cos'è Hashcat? Il primo passo nel cracking delle password [Guida per principianti]
  • Word/Excel/Pdf/PPT/RAR/zip/7z在线密码破解
  • offfice、PDF、压缩文件、WPS、在线密码恢复
  • hashcatonline.com在线密码破解版权所有2010-2025