Potrei aver frainteso, ma se voglio usare un algoritmo di hashing come argon2, cosa impedisce a qualcuno di vedere come funziona e invertire quello che fa?
Potrei aver frainteso, ma se voglio usare un algoritmo di hashing come argon2, cosa impedisce a qualcuno di vedere come funziona e invertire quello che fa?
Essere pubblici è esattamente il punto: mostri a tutti come è fatto e quanto sia difficile invertirlo. È come mostrarti un enorme puzzle con un trilione di pezzi, ma con ogni pezzo al suo posto e mescolare tutto. Sai che tutti i pezzi formano il puzzle (l'hai appena visto), e sai che è molto, molto difficile rimettere tutto a posto. Un hash pubblico mostra come è fatto (il risultato) e quanto è difficile fare tutto al contrario.
Una funzione hash pubblica è solo un insieme di operazioni matematiche. Chiunque può (ma solo pochi lo faranno) eseguire le operazioni a mano e dimostrare che l'algoritmo funziona come previsto. Chiunque può invertirlo, ma ci vuole così tanto tempo (trilioni di anni con tutta la potenza di calcolo del nostro pianeta combinata) che il modo più economico per invertirlo è una forza bruta.
A meno che non sia carino funzione hash insicura di base.
Probabilmente non è la risposta che stai cercando, ma considera questo.
Prendi un numero di 10 cifre, qualcosa come 3.481.031.813, e poi ora con carta e penna trova il quadrato (cioè moltiplicalo da solo). Anche se noioso, questo è relativamente semplice e può essere realizzato dopo un po 'di tempo.
Ora con la stessa penna e carta, prova a calcolare la radice quadrata di un numero di 20 cifre. Questo è un compito molto molto più difficile, anche se è effettivamente il contrario del primo compito.
Le funzioni matematiche possono essere create, in modo che la funzione inversa sia molto più difficile da risolvere. Gli hash in un modo portano questo alla loro conclusione logica: la funzione è così difficile da risolvere da essere resa praticamente irrisolvibile.
A questo si aggiunge il fatto che le informazioni vengono perse lungo il percorso. Il quadrato di 2 è 4, ma la radice quadrata di 4 è sia +2 che -2. Le informazioni sono andate perse durante la funzione quadrato, su quale fosse il segno del numero originale. Anche le funzioni hash lo fanno in modo efficace, le informazioni vengono perse quando prendi un file da 10 GB e lo riduci a un hash a 256 bit, semplicemente non c'è più modo di ricostruire il messaggio originale.
Non credo che sarò in grado di dare una risposta che ti soddisfi pienamente, ma la risposta breve è che perché una cosa sia chiamata "funzione hash crittografica" deve essere una funzione abbastanza complessa che questo tipo di il reverse engineering non è facile. Questo non vuol dire che sia impossibile, ma non appena qualcuno fa anche solo un po 'di progresso nel reverse engineering di una funzione hash crittografica, la considereremo non funzionante e passeremo a qualcosa di più forte. Puoi leggere di più sulle proprietà delle funzioni hash crittografiche qui (wikipedia).
Come esempio diamo un'occhiata a SHA-1, le proprietà di una funzione hash crittografica sono:
Nel 2005 è stato inventato che può trovare collisioni in circa 2 60 operazioni. Sono ancora milioni di $ USD per eseguire quell'attacco e, per quanto ne so, non ci sono ancora attacchi alle altre due proprietà crittografiche (pre-immagine e seconda pre-immagine), ma questo è sufficiente per considerare SHA-1 completamente rotto.
Perché non puoi invertirli.
Fondamentalmente, se è così facile, perché non lo fai? Bene, c'erano funzioni hash più semplici e le persone hanno capito come invertirle, e poi altre persone hanno fatto in modo che quei modi non funzionassero. Ormai, abbiamo funzioni hash che nessuno sa come invertire.
Potrebbe essere illuminante provare effettivamente a invertire qualcosa come MD4 e vedere dove sei bloccato. Quindi scopri come è stato invertito MD4. Per quest'ultima parte, dovrai trovare e leggere i documenti accademici: è più facile se sei uno studente universitario e la tua università paga per darti accesso ai luoghi in cui vengono caricati i documenti, ma spesso puoi trovarli su Internet altrove.
Per fare l'analogia, conoscere "come funziona la funzione di hashing" è come "conoscere una ricetta per i pancake". È semplice: prendi farina, acqua, uovo, un pizzico di sale e zucchero e mescolali insieme, poi mettili in padella con olio caldo, e poi riempi con marmellata o quello che vuoi.
Semplice, veloce e facile da sapere come fare, e la sua conoscenza (proprio come la conoscenza di come funziona la funzione di hashing) è pubblica (quindi non c'è nemmeno bisogno di decodificarla)
Ora, vuoi "invertire l'hash". Applica la stessa analogia con il pancake: hai un delizioso pancake alla marmellata caldo finito e vuoi estrarre da esso "l'uovo crudo originale non strapazzato".
Buona fortuna con questo: nessuna quantità di "processo di reverse engineering per fare pancake" ti aiuterà a farlo.
Allo stesso modo in cui funziona la matematica utilizzata nelle funzioni hash crittografiche - lo è estremamente semplice da fare in un modo, ma non è possibile farlo al contrario.
TL; DR; Le funzioni di hash crittografico sono progettate per essere unidirezionali indipendentemente dal fatto che siano progettate apertamente o meno.
Prima di tutto, Argon2 è un algoritmo di hashing della password per coloro che vogliamo da loro
Per l'hashing della password, la resistenza alle collisioni non è richiesta, sono richieste le resistenze pre-immagine.
Per le funzioni hash crittografiche come SHA2, SHA3, serie Blake, il primo requisito è la resistenza alle collisioni. Una volta che hai una resistenza alle collisioni, puoi avere le resistenze pre-immagine (la seconda dimostrata implica che la prima è complicata e richiede un grande input).
cosa impedisce a qualcuno di vedere come funziona e di invertire quello che fa?
Nella crittografia moderna, lavoriamo con i principi di Kerckhoffs. Insomma, a parte la chiave, tutto è pubblico. Non tutte le funzioni hash crittografiche sono senza chiave, esistono funzioni hash con chiave come HMAC e NMAC.
Le funzioni hash sono progettate per funzionare con lunghezza di dimensione arbitraria e dimensione di output fissa. Ciò implica:
Pertanto, essendo invertibile , anche se non lo vogliamo e non esiste un attacco simile a funzioni hash ben progettate, potrebbe non essere molto utile.
Perché non può essere reversibile;
La risposta esatta dipende dal design della funzione hash. Ad esempio, diamo un'occhiata alla serie SHA256. Usano la funzione di compressione e che è progettata da un codice a blocchi altamente iterato in cui il messaggio è la chiave. La funzione di compressione che accetta i precedenti 256 bit come testo normale e l'attuale messaggio a 512 bit come chiave e produce un output a 256 bit. Nell'interno, la funzione round del cifrario a blocchi utilizza l'operazione AND
. L'operazione AND
perde informazioni e questo impedisce la reversibilità. Quindi, anche se hai solo un messaggio con hash a 256 bit (che richiede riempimento) non puoi tornare indietro poiché la funzione di compressione non è reversibile .
Ciò non significa che non sia possibile attacco alle funzioni hash crittografiche. MD5 ha un attacco di collisione, SHA-1 ha un attacco di collisione e recentemente questo si è trasformato in un messaggio di falsificazione ( un elenco degli attacchi a SHA-1).
Diamo un'occhiata al problema da un punto di vista matematico. Per il bene dell'argomento, supponiamo che una funzione di hashing sia una qualsiasi funzione, diciamo f (x) che mappa un insieme di input X su un insieme di output Y .
Quindi mi stai chiedendo: se conosco f e so y perché non riesco a trovare semplicemente x tale che f (x) = y ? La bellezza (e l'unica ragione per cui ha senso) della crittografia è che ci sono funzioni progettate in modo tale che risolvere f (x) = y è follemente difficile, anche quando sai esattamente cosa f e y lo sono.
Questa è solo matematica, alcune equazioni sono difficili. Infatti, per alcune funzioni (come la famiglia SHA) non è noto alcun metodo efficiente per risolvere queste equazioni. Questa è anche nota come resistenza preimage, una delle caratteristiche fondamentali delle funzioni crittograficamente sicure.
Esistono operazioni matematiche facilmente reversibili. Ad esempio, "aggiungi 312,579" può essere facilmente annullato eseguendo "sottrarre 312,579". Se Argon usasse solo operazioni facilmente reversibili, potresti essere in grado di invertirlo. Non è così.
Un'operazione abbastanza semplice che non può essere annullata è calcolare x ^ 3 modulo p, dove p è un numero elevato. Se ti do un numero y e ti dico che y = x ^ 3 modulo p, non esiste un modo noto per trovare x in un tempo ragionevole a meno che non ti fornisca alcune informazioni aggiuntive su p. (Questa è all'incirca la base per RSA).
Per l'hashing, che esegue l'hashing arbitrario di grandi quantità di dati in dati di dimensioni fisse, c'è anche il problema che molti valori di input diversi produrranno lo stesso output con hash. Quindi le funzioni di hashing non possono essere reversibili. (Tuttavia, per le password con hash questo non fermerebbe un hacker perché se trova la password "sbagliata" con l'hash corretto, anche quella password "sbagliata" funzionerebbe. Le tue possibilità di trovare una password "sbagliata" sono pari a zero).
Accetti già che gli algoritmi di crittografia (buoni) possano essere resi pubblici fintanto che la key rimane privata? In tal caso, considera questa analogia:
Quando si crittografa qualcosa, non è possibile invertire la crittografia senza la chiave, tranne che provando miliardi di chiavi con la forza bruta.
Per gli scopi di questa analogia, l'hashing è simile, tranne per il fatto che il messaggio originale è anche usato come chiave. Quindi se non hai il messaggio, non hai la chiave. Non puoi invertire * l'hash senza la chiave. Tranne che provando miliardi di chiavi con la forza bruta.
(Puoi tecnicamente creare algoritmi simili a hash da algoritmi di crittografia in questo modo, ma non dovresti. Potrebbero non avere le proprietà necessarie delle funzioni hash crittografiche .)
* La parola corretta qui è verifica ma rompe l'analogia.
L'hashing non può essere annullato perché il processo di hashing di qualcosa perde la maggior parte delle informazioni. Per ogni singolo risultato di un algoritmo di hash ci sono un numero infinito di input diversi che daranno lo stesso risultato.
Considera uno degli algoritmi di hash più semplici, il semplice checksum. Immagina di aver selezionato una pagina da un libro a caso. Per ogni lettera sulla pagina, converti la lettera in un numero, A = 1, B = 2, ecc. E somma i numeri. Per il checksum più semplice, questo è tutto.
Se un amico fa questo e ti dà il risultato di 28543, come farai a capire quale libro e quale pagina stavano guardando? Ora un checksum normalmente non è effettivamente considerato una funzione di hashing perché è semplicemente troppo semplice. È estremamente facile trovare o creare input che danno lo stesso checksum, che si chiama ricerca di una collisione . Ecco un modo: prendi il checksum di 28543, dividi per 26, per ottenere 1097 Z, con 21 rimasti, che è una U. Anche i checksum sono facili da manipolare. Supponi di aver trovato una pagina nel tuo libro che ha aggiunto fino a 28540, beh puoi semplicemente aggiungere una C alla fine per ottenere lo stesso checksum.
Gli hash crittografici devono essere progettati con cura per renderlo molto difficile per trovare le collisioni. Garantiscono che input simili forniscano output completamente diversi. Idealmente, la modifica di un solo bit dell'ingresso provocherà il capovolgimento di metà dei bit di uscita. Ma anche così, con una potenza di calcolo sufficiente, è ancora possibile trovare collisioni. E le collisioni possono essere utili. Se un computer esegue l'hash delle password, se riesci a trovare una collisione puoi accedere con quella che hai trovato anche se potrebbe essere diversa dalla password originariamente sottoposta ad hashing. Se due password hanno lo stesso hash, il computer non può distinguerle. Ma anche se riesci a trovare una collisione, ciò non equivale a invertire l'algoritmo di hashing. Trovare una collisione non ti dirà quale degli infiniti input è stato originariamente sottoposto ad hashing.
Un esempio di una funzione di hashing che non è una funzione di hashing particolarmente buona o cattiva, ma può essere vista come molto difficile da invertire senza una matematica approfondita:
Prendi un intero a 64 bit x. Per calcolare l'hash h (x), calcola sin (x) con una precisione di 100 cifre, quindi prendi le cifre da 81 a 100 di sin (x) come codice hash. Ok, non è particolarmente facile da calcolare, richiede un po 'di tempo, ma non è neanche particolarmente difficile.
Ora, se ti do le cifre da 81 a 100 di sin (x), come faresti per trovare x? Le prime 20 cifre ti darebbero buone informazioni. Ma non hai nessuna delle prime 80 cifre. Sai che x è un numero intero, il che rende il problema risolvibile in teoria, ma sembra che non ci sia algoritmo migliore del calcolo di sin x per x = 1, 2, 3 ecc. Finché non trovi quello giusto. Nel peggiore dei casi devi controllare sin (x) per 2 ^ 64 valori x.
Sapere come si fa una cosa non sempre significa che puoi annullarla.
Certo, se ti dico che l'unico modo per entrare in casa mia è indovinare un codice a tre cifre, allora hai informazioni sufficienti per dargli un buon tentativo con la forza bruta.
Ma se invece scopri che devi conoscere qualche frase segreta che solo io conosco, non ti gioverà. Non ti aiuta a capire la frase. (Suppongo che ti dia abbastanza informazioni per rapirmi e torturarmi, ma non lasciamoci prendere la mano.)
Un principio fondamentale di tutti algoritmi crittografici decenti è proprio questo sapere come è fatto non dovrebbe permetterti di annullarlo . Dovrebbero essere necessarie altre informazioni per decrittografare le informazioni, come una chiave segreta. Altrimenti l'algoritmo sarebbe piuttosto inutile, in particolare come un ipotetico algoritmo non documentato la cui segretezza è la crittografia non può essere condivisa e quindi non può essere utilizzato per crittografare le comunicazioni tra due o più entità.
Infine, è importante capire che l'hashing non è crittografia . Niente di quanto sopra si applica all'hashing perché l'hashing è unidirezionale per sua stessa natura. È con perdite. Non è lì per fare qualcosa di segreto: è lì per creare un digest portatile che mostra se alcune informazioni sono state danneggiate (o manipolate) senza dover esaminare l'intero payload. È un verificatore, non un segretario.
Solo per aggiungere alla domanda:
I tuoi valori hash devono essere di una certa "difficoltà" perché se un utente malintenzionato conosce il tuo algoritmo, può creare delle tabelle "arcobaleno" in cui gli hash questa tabella è stata precedentemente creata da un utente malintenzionato e controlla se "il tuo hash" corrisponde a un hash nella tabella 'made' .... quindi sapendo qual era il valore originale hash da te.
Puoi facilmente trova online gli hash invertiti per parole come: "Hello World", "Password123", ecc ...