Domanda:
Non potremmo creare una stringa che produca lo stesso hash di un'altra stringa in SHA-256?
BOI
2020-08-12 01:23:27 UTC
view on stackexchange narkive permalink

Supponiamo di avere un algoritmo di hashing separato chiamato s2 e convertirà Hello in dug84nd8.

Se potessimo prendere l'algoritmo e eseguire il reverse engineering per generare una stringa come 8GN492MD che restituirebbe anche dug84nd8 , non direbbe che (s2 ("Hello") = s2 ("8GN492MD ")) == true) e far entrare un hacker?

Mi sembra che mi manchi qualcosa, ma non so cosa sia.

Nota che questo non viene chiamato "decrittografia" perché non ottieni indietro la stringa originale, solo un'altra stringa che ha lo stesso valore.A differenza della crittografia, gli hash non possono essere annullati
"Mi sembra che mi manchi qualcosa" ... Guarda questo video e vedrai cosa ti stai perdendo: https://www.youtube.com/watch?v=y3dqhixzGVo
Questo risponde alla tua domanda?[Perché le funzioni hash sono unidirezionali?Se conosco l'algoritmo, perché non posso calcolarne l'input?] (Https://security.stackexchange.com/questions/11717/why-are-hash-functions-one-way-if-i-know-l-algoritmo-perché-non-posso-calcolare-t)
Si noti che per algoritmi di hash delle password più deboli è frequente che uno strumento di cracking dell'hash delle password forzi un hash e trovi una password che non era la password originale, ma poiché ha lo stesso hash sarà accettata.Tuttavia con hash più forti / più lunghi questo non è visto poiché non è possibile eseguire una ricerca esaustiva e la probabilità di forzare brute una seconda pre-immagine è molto bassa.
@Gilles'SO-stopbeingevil' non è una vittima di quello.L'OP non sta cercando di calcolare l'input originale.
@schroeder L'OP sta cercando di calcolare un'immagine preliminare, che è esattamente la stessa della domanda precedente.
@Gilles'SO-stopbeingevil' Dal dupe proposto: "non può semplicemente invertire il processo per calcolare la password dall'hash?"Sembra essere un attacco diverso e una domanda diversa.Questa domanda riguarda 2 input con lo stesso hash, non calcolando "Hello" da "dug84nd8"
Si, puoi farlo.Hai provato?Se ci provi, potresti trovare alcuni strani ostacoli sulla tua strada.Ora considera che nessuno è ancora riuscito a trovare un modo per aggirare questi ostacoli.Lo hanno fatto per le vecchie funzioni hash come MD5, motivo per cui non usiamo più le vecchie funzioni hash.
Certo che potresti.
La risposta (sì, ecco perché è necessario scegliere un buon algoritmo) non sarebbe sulla prima pagina di qualsiasi tutorial sull'hashing?
Sì.Questa è chiamata collisione hash.È intrinseco all'hashing.Buoni algoritmi di hash renderanno estremamente difficile provocare una collisione.
Tredici risposte:
abligh
2020-08-12 11:00:25 UTC
view on stackexchange narkive permalink

La tua premessa ha un difetto. Dici di voler "decodificare" la funzione hash. Non è necessario decodificarlo: la sua implementazione è pubblica.

Quello che non puoi fare è invertirlo (forse è quello che intendevi), perché non è invertibile. Si può facilmente dire che non è una funzione invertibile perché la dimensione del dominio (possibile numero di input) è maggiore della dimensione dell'intervallo (possibile numero di output). L'intervallo è 2 ^ 256 (possibili stati di output) e la dimensione dello spazio di input è infinita (tecnicamente 2 ^ (2 ^ 64) apparentemente, ma molto più grande di 2 ^ 256). Ed è esattamente ciò che consente le collisioni (in base al principio del buco di piccione, deve esserci più di un possibile input per ogni output, almeno per uno degli input).

L'intero design della funzione hash lo rende computazionalmente difficile trovare quelle collisioni. Esistono tre proprietà degli hash (prima resistenza pre-immagine, seconda resistenza pre-immagine e resistenza alle collisioni) che descrivono quella proprietà in modo più preciso.

Quindi la risposta alla tua domanda è che il design della funzione rende è volutamente difficile da ottenere anche se sai esattamente come funziona la funzione.

Per i dettagli (in un contesto leggermente diverso) di come le funzioni possono eseguire sorprendentemente (perché ad esempio è impossibile "tornare indietro them "per invertirli), vedere le risposte qui.

L'intervallo è 2 ^ 256 e la dimensione dello spazio di input è infinita Se lo spazio di input è infinito, c'è un numero infinito di collisioni.∞ / 2²⁵⁶ = ∞ ...
@d-b sì, ma tecnicamente non è necessario che ci sia una collisione infinita (o anche più di una) per ogni valore di output;potrebbe essere il caso che un sottoinsieme di valori di output abbia un solo possibile valore di input o nessuno.Sospetto che non sia possibile dimostrare se esiste un numero infinito di collisioni per ciascun valore di output per SHA-256, anche se sospetto che sia così.
La dimensione dello spazio di input non è del tutto infinita, è 2 ^ (2 ^ 64) poiché la dimensione dell'input viene aggiunta prima di prendere l'hash.Non che sia probabile che tu abbia mai un input più grande di quello.
@d-b e tuttavia, [le collisioni non accadono davvero] (https://crypto.stackexchange.com/a/47810/62225).
@CaptainMan Questo perché 2 ^ 256 ≈ il numero di atomi nell'universo visibile.
_ "non è una funzione invertibile perché la dimensione del dominio è maggiore della dimensione dell'intervallo" _ - Stai parlando della [definizione ** matematica ** di funzioni unidirezionali] (https: //en.wikipedia.org / wiki / Injective_function), ma non è questo ciò che è rilevante qui.La [** definizione crittografica **] (https://en.wikipedia.org/wiki/One-way_function) è _ "una funzione computazionalmente impossibile da invertire" _.Il fatto che l'inverso sia una funzione multivalore irrilevante.
@rtpax IIRC, è il conteggio _bit_ fino a 2 ^ (2 ^ 64).Quindi lo spazio di input è _only_ 2 ^ (2 ^ 61) _bytes_.Accidenti, questo dovrebbe aiutare un _bit_.
Innanzitutto, lo spazio di input SHA256 è limitato a causa dello standard di riempimento del NIST.Si può hash al massimo 2 ^ 64 bit quindi ci sono al massimo 2 ^ (2 ^ 64) messaggi diversi.2, non sei corretto riguardo al principio della casella.Dice solo che c'è almeno una casella con più di un piccione.Non parla di altri che possono essere vuoti o meno.Con questo, possiamo dire che almeno ci deve essere una collisione.Ovviamente, idealmente, ci aspettiamo che SHA256 sia una funzione casuale uniforme.
AiliugvbcsCMT risolto.
Non vedo che le modifiche vengano apportate in modo diverso.Inoltre, nemmeno noi sappiamo che SHA256 assiste a tutti i valori se tagliamo l'uscita di SHA256 in 64 bit.Quello che sappiamo la sua uscita sembra casuale uniforme.
kelalaka
2020-08-12 03:52:41 UTC
view on stackexchange narkive permalink

Stai mescolando gli attacchi alle funzioni hash. La definizione formale di attacchi generici alle funzioni hash crittografiche può essere trovata in Cryptographic Hash-Function Basics: Definitions, Implications, and Separations for Preimage Resistance, Second-Preimage Resistance, and Collision Resistance di P. Rogaway e T. Shrimpton. Può essere semplicemente dato come;

  • L'attacco pre-immagine : dato un valore hash h , trova un messaggio m tale che h = Hash (m) . Considera l'idea di archiviare gli hash delle password sul server. Per esempio. un utente malintenzionato proverà a trovare una password valida per il tuo account.

  • Il secondo attacco pre-immagine (chiamato anche collisione debole) : dato un messaggio m1 , trova un altro messaggio m2 tale che m1 ≠ m2 e Hash (m1) = Hash (m2) . Un esempio sta producendo una contraffazione di un dato messaggio.

  • L'attacco di collisione (chiamato anche collisione forte) : trova due input che hanno hash al stesso output: a e b tale che H (a) = H (b) , a ≠ b .

SHA-256 non è ancora rotto per nessuno di questi attacchi generici. Vedi: Cosa rende SHA-256 sicuro? su crypto.stackexchange.

se potessimo prendere l'algoritmo e semplicemente decodificarlo per generare una stringa come 8GN492MD che restituirebbe anche dug84nd8

  • Se consideriamo solo questo è l'attacco pre-immagine e il costo è O (2 ^ 256) per SHA-256. Si noti che lo scopo dell'attacco pre-immagine non è trovare l'input originale, ma piuttosto trovare un input che abbia lo stesso valore hash. Se non esiste un test esterno per l'input, non è possibile decidere che la pre-immagine trovata sia la pre-immagine. Inoltre, lo spazio di ricerca effettivo per la pre-immagine può essere molto più grande delle maniglie dell'attacco pre-immagine.

    Esiste una variante dell'attacco pre-immagine, che si verifica quando lo spazio del messaggio è breve, come l'hashing dei numeri di telefono. In questo caso, potrebbe essere molto facile trovare la pre-immagine.

Se potessimo prendere l'algoritmo e semplicemente decodificarlo per generare una stringa come 8GN492MD che restituirebbe anche dug84nd8 , non direbbe che (s2 ("Hello") = s2 ("8GN492MD")) == true) e lasciare che un hacker in?

  • Se consideriamo sopra in termini più semplici; dato Hello e dug84nd8 = SHA256 (Hello) e trova un altro messaggio con lo stesso valore hash richiesto, questo è il secondo attacco pre-immagine e il costo è O (2 ^ 256) per SHA256.

La seconda pre-immagine è quello che stai cercando. Questo non è fattibile e non solo SHA-256, ma anche nessuna delle funzioni hash crittografiche viene interrotta in questo modo.

  • Il costo di un attacco di collisione di SHA-256 è O (2 ^ 128 ) a causa dell ' attacco del compleanno con una probabilità del 50%. Nell'attacco di collisione, gli aggressori sono liberi due scelgono a e b . Questo non è il tuo caso poiché inizi con un messaggio fisso.

La conclusione , nessuno di questi attacchi non è fattibile per SHA-256 a partire dal 2020.


Gli errori nella risposta più in alto

L'intervallo è 2 ^ 256 (possibili stati di output ) e la dimensione dello spazio di input è infinita (tecnicamente 2 ^ (2 ^ 64) apparentemente, ma molto più grande di 2 ^ 256). Ed è esattamente ciò che consente le collisioni (in base al principio della buca delle lettere, deve esserci più di un possibile input per ogni output, almeno per uno degli input).

Lo spazio di input SHA256 è limitato a causa dello standard di imbottitura del NIST. Si può eseguire l'hashing al massimo di 2 ^ 64 bit quindi ci sono al massimo 2 ^ (2 ^ 64) messaggi diversi poiché la dimensione del messaggio è codificata alla fine del riempimento in 64 bit.

Il principio della casella dice solo che esiste almeno una casella contenente più di una casella. Non parla di altri che possono essere vuoti o meno. Con questo, possiamo dire che almeno ci deve essere una collisione. È interessante notare che non sappiamo che un SHA256 limitato a 64 bit raggiunge tutti i valori a 64 bit. Quello che ci aspettiamo da SHA256 è che sia indistinguibile da uniformemente casuale.

Puoi facilmente dire che non è una funzione invertibile perché la dimensione del dominio (numero possibile di input) è maggiore della dimensione di l'intervallo (possibile numero di output).

Anche questo non è corretto. Prendi modulo 2 ^ 256 come hash, quindi non è invertibile. Uno, tuttavia, dato un valore hash può calcolare facilmente una pre-immagine, dato x , a ;; x + k 2 ^ 265 sono pre-immagini. In altre parole, abbiamo invertito la mappa. La definizione corretta è una funzione che non è computazionalmente possibile invertire

Ricordo di aver trovato un sito web in cui qualcuno ha preso lo sha-256 di "Hello, world!"e ne ha fatto una corda
Inoltre non scelgo le stringhe a caso, eseguo il reverse engineering di tutte le porte not e xor e quant'altro per creare una stringa fattibile.
@BOI farlo per i moderni algoritmi di hashing è letteralmente impossibile.Provare stringhe casuali fino a trovare una corrispondenza è l'unica opzione
@BOI: Se sei davvero in grado di farlo, succederanno due cose: 1) Diventerai molto famoso, perché sei riuscito a fare qualcosa che l'intera comunità crittografica ha provato e fallito per 20 anni.2) Qualcuno analizzerà il tuo attacco e progetterà una nuova funzione hash che risolva il difetto che abilita il tuo attacco.Gli attuali attacchi più noti su SHA-256 sono solo su varianti a round ridotto.
@BOI Ti incoraggio a provarlo e vedere cosa succede!
SHA256 ha guadagnato molta attenzione grazie a Bitcoin.
@BOI Essenzialmente, anche _if_ sei riuscito a trovare un valore con hash allo stesso valore di SHA256 ("Hello, world!"), Questo darebbe accesso solo agli account che utilizzavano "Hello, world!"come password, che se sapessi quali account erano, potresti semplicemente usare "Hello, world!"ed evita di preoccuparti delle collisioni di hash.E ciò presuppone anche che il servizio protetto non abbia preso altre precauzioni di base come la salatura.E che stanno usando SHA256 diretto, non iterativo, altri algoritmi, ecc.
@JörgWMittag "Qualcuno analizzerà il tuo attacco e progetterà una nuova funzione hash che risolva il difetto" è una convinzione ottimistica piuttosto che un dato di fatto.Non è necessariamente vero che possiamo sempre farlo.
freakish
2020-08-12 11:32:50 UTC
view on stackexchange narkive permalink

e far entrare un hacker?

Certo. Ma il fatto è che in realtà non sappiamo come trovare un'altra stringa che produca lo stesso hash in modo efficiente. Almeno per SHA-256 e altri algoritmi di hashing ampiamente utilizzati. Nota che questi algoritmi sono pubblici, non è necessaria alcuna ingegneria inversa, il che non cambia nulla. Questo è semplicemente troppo difficile, e in effetti quegli algoritmi sono deliberatamente progettati in questo modo.

L'intero problema si riduce alla risoluzione dell'equazione f (x) = y per alcune funzioni f e alcune y. Una possibilità è scansionare tutte le x, assumendo che il dominio sia enumerabile. Ma è inefficiente e funziona solo se sappiamo già che esiste una soluzione (che non sono sicuro che tutti i valori di SHA siano raggiunti più volte). Altre possibilità spesso non sono note.

Forse questo è un problema educativo. A scuola ci viene spesso detto di risolvere le equazioni. Lineare, polinomiale, logaritmica, seno, ecc. Quello che non ti dicono è che scelgono queste equazioni in modo tale che siano risolvibili e in modo relativamente facile. Ma in effetti anche adesso le menti più brillanti non sanno come risolvere la maggior parte delle equazioni là fuori. E qui ti sei imbattuto in uno di questi esempi (estremamente importanti).

Nota che la situazione potrebbe (e lo è già successo per altre funzioni hash) cambiare in futuro.

* Sappiamo * come trovare un'altra stringa che produca lo stesso hash.Almeno, hai la forza bruta.Semplicemente non sappiamo come farlo in un vincolo di tempo / energia fattibile.
@LawnmowerMan Ho aggiornato la risposta.Tuttavia non mi è chiaro se la forzatura bruta sia garantita per fermarsi.Cioèse ogni output ha più di 1 preimage.
Forse no, ma anche la forza bruta può dimostrarlo.;)
@LawnmowerMan solo nell'ipotesi che l'universo sia finito.:)
@freakish Bene, ci interessa davvero trovare un input _different_?Stiamo cercando un input e presumiamo che troveremo un input alternativo (in collisione) più velocemente dell'input originale (inoltre, presumibilmente non abbiamo nemmeno un modo per verificarlo).Trovare l'input originale è altrettanto buono, per quanto riguarda l'hacking.
@freakish la domanda se è garantito lo stop normalmente non è importante.Se si imposta l'arresto dopo ad es.$ 2 ^ 260 $ prova, hai quasi il 100% di possibilità di trovare almeno una (seconda) preimmagine.Ma comunque, ciò avverrà dopo la vita dell'universo, quindi non serve.
Nick2253
2020-08-12 19:16:41 UTC
view on stackexchange narkive permalink

Credo che la risposta di @ kelalaka sia la più accurata, ma volevo aggiungere un esempio che, si spera, possa far luce sul problema.

Prima di tutto, sei assolutamente preciso che potresti segui tutta la logica nel circuito e alla fine ottieni una collisione. Tuttavia , una delle caratteristiche di una buona funzione hash crittografica è che questo esercizio è sostanzialmente difficile quanto solo indovinare casualmente.

Considera il seguente circuito . M1-M3 sono i bit del messaggio. Dato un messaggio 101 e un seme di 1 , otteniamo un output di 1.

Three chained XORs in a circuit.

Ora, proviamo a trovare un messaggio diverso che si scontri con 101 ricalcando il circuito. Dall'output, sappiamo che M3 potrebbe essere 1 o 0 . Scegliamo 0 ; ciò significa che l'altra gamba deve essere 1 ( 1 XOR 0 è 1 ). Veniamo ora a M2. Inoltre selezioneremo di nuovo 0 . Ora guardiamo M1. Sceglieremo 1 per M1. Ma, uh-oh. Il seme ora dovrebbe essere 0 . 100 funziona solo come messaggio se il seme è 0.

Ovviamente, in questo esempio molto semplicistico, avremmo potuto banalmente assegnare M1 come 0 , quindi il valore iniziale sarebbe stato 1 come previsto. Ma il punto di questo esempio è evidenziare gli elementi di feedback e concatenamento che rendono questo semplice approccio "basta ripercorrere il circuito" molto più complicato in un vero algoritmo di hashing crittografico. Il "circuito" richiesto per implementare questi algoritmi è estremamente complicato, perché consiste in moltiplicazione, esponenziazione, aritmetica modulare, ecc. E la natura ricorsiva di alcuni di questi calcoli fa del tracciare il circuito all'indietro un enorme esercizio di ramificazione. Ancora una volta, non è impossibile; piuttosto è difficile quanto indovinare a caso.

perché avere il seme 0 è un problema?
@BOI Perché il seme è "1" fa parte dell'algoritmo di hashing come l'ho descritto.Se volessi che il seme fosse "0", andrebbe bene, ma sarebbe una funzione hash diversa, che produce hash diversi.
user3067860
2020-08-12 21:48:58 UTC
view on stackexchange narkive permalink

"Prova a caso finché non trovi un input che produca l'hash corretto." Sì, ma è comunque un attacco di forza bruta. Questa è la premessa di un attacco alla tabella arcobaleno. Pre-calcola i valori in modo da avere un input per ogni output possibile. Quindi, invece di provare tutti gli input possibili, puoi provare solo un sottoinsieme di input che producono hash univoci. Non importa se ottieni l'esatto input che era la password originale perché il sistema non è in grado di capire la differenza.

Ecco i problemi:

  1. Hai per trovare l'input per ogni hash. Come altre risposte hanno detto, questo è "abbastanza lento" con le moderne funzioni di hashing poiché è solo forza bruta. (A meno che tu non abbia un computer quantistico in giro.) Il vantaggio principale di una tabella arcobaleno è che per le funzioni in cui PUOI calcolarlo, puoi calcolarle tutte una volta e riutilizzare i risultati più e più volte senza ricalcolare (scambiando lo spazio di archiviazione tutti quei valori per il risparmio di tempo di non doverli ricalcolare).
  2. Non si ottiene la password effettiva. In molti casi, le persone stanno attaccando sistemi meno sicuri non perché vogliono entrare in quei sistemi, ma per approfittare di persone che riutilizzano password / login su altri sistemi più interessanti.
  3. Se l'attaccante non lo fa conoscere l'hash di destinazione e deve confrontarsi con il sistema di destinazione, quindi può essere bloccato limitando il numero di tentativi errati. (L'autore dell'attacco che conosce l'hash di destinazione può essere bloccato da altre pratiche di sicurezza di base.)
  4. Salt. Aggiunta di un'altra stringa univoca per l'utente alla password prima dell'hashing. Ad esempio, supponiamo di aggiungere il nome utente alla fine della password prima di eseguirne l'hashing. Ora dobbiamo trovare una stringa che, quando il nome utente viene aggiunto alla fine, calcola un hash. Poiché il nome utente è unico per ogni utente, non possiamo precalcolarlo in blocco, siamo tornati a farlo uno per uno ... molto inefficiente, ovvero richiede tempi incredibilmente lunghi.
Immagino che fosse molto più semplice eseguire l'hashing di una password come hash ("hello123");e poi indirizzi email o nomi utente a forza bruta finché non trovi qualcuno abbastanza stupido da usare "ciao123" come password
Il tuo primo paragrafo è la descrizione più leggibile delle tabelle arcobaleno che ho visto.Grazie a te, finalmente li capisco.Ho letto Wikipedia e diversi lunghi articoli "esplicativi", e nessuno di questi è stato utile quanto le due frasi centrali del ¶ 1.
@Michael Sono contento di essere stato in grado di aiutare!
@Michael Sebbene tutto il resto sia valido, questa risposta non spiega correttamente le tabelle arcobaleno.Non memorizzano un input per ogni possibile output (sarebbero più terabyte delle stelle nell'universo, anche per MD5.) Le tabelle arcobaleno implicano il precalcolo (diciamo) di un milione di hash e la memorizzazione (diciamo) 1000 di essi.Utilizzando un algoritmo intelligente, quei milioni possono essere ricostruiti utilizzando molto lavoro, ma molto * meno * della pura forza bruta.Le tabelle arcobaleno sono semplicemente una leva per attaccare password un po 'più lunghe quando non è possibile memorizzare tabelle precalcolate di quella dimensione.
@Artelius Phooey.Grazie per il chiarimento.
fraxinus
2020-08-12 12:08:08 UTC
view on stackexchange narkive permalink

Probabilmente mescoli "ingegneria inversa" e trova una "funzione inversa". Questi sono concetti diversi.

Il reverse engineering sta deducendo l'algoritmo dalla sua implementazione (chiusa). L'algoritmo SHA-256 è pubblico e puoi saltare del tutto la parte di reverse engineering. Basta guardare in Wikipedia, o il codice sorgente di qualche libreria crittografica open source.

Per rompere la crittografia (nel tuo caso, per trovare una "collisione di hashing"), devi trovare un " funzione inversa "- nello stesso senso matematico in cui la radice quadrata è la funzione inversa del quadrato.

Gli algoritmi di hash utilizzati per la crittografia sono progettati specificamente per resistere alla ricerca di collisioni e funzioni inverse. Se qualcuno trova un modo semplice per trovare le collisioni, la funzione hash corrispondente viene considerata compromessa e le persone smettono di usarla. Questo è quello che è successo alle funzioni MD5 o SHA-1.

Ci sono altre funzioni di hashing (ad esempio create per l'uso nelle tabelle hash del database) che NON sono fatte per essere molto resistenti alle collisioni, ma sono meno costose dal punto di vista computazionale e / o avere altri vantaggi. Si chiamano ancora hash, ma vengono utilizzati nei rispettivi campi e non in crittografia.

Con una funzione inversa, proverei a trovare ogni funzione che ha sha-256, e per esempio un cancello NOT, sceglierei un input casuale, che andrebbe avanti e indietro finché non c'è una stringa funzionante
-1
@BOI ci sono molti gate in SHA-256.Se provi input casuali per tutti loro, proverai molti input casuali prima di trovare quelli che funzionano.Ricorda che più porte hanno tutte lo stesso ingresso, quindi un ingresso che funziona per una porta potrebbe non funzionare per un'altra porta.
@BOI il motivo per cui questo non funziona è perché non puoi farlo bit per bit, poiché in una funzione crittografica generalmente ogni bit di output è / può essere influenzato da * ogni * bit di input.Questo riduce un "scegliere un input casuale e tornare indietro se è sbagliato" alla ricerca di tutto lo spazio possibile per le chiavi, poiché l '"input casuale" deve essere l'input * intero * e ottenere uno giusto per caso è 1/2 ^ 256= effettivamente zero.
Artelius
2020-08-14 11:18:57 UTC
view on stackexchange narkive permalink

Distruzione delle informazioni

Quando si calcola una funzione hash, le informazioni vengono distrutte in determinate fasi dell'algoritmo. Questa è la chiave per cui non è possibile "eseguire l'algoritmo al contrario".

Se inizi con l'hash ccb92793f8a87a695fa3f2e805779da8 , lavorando all'indietro, potrebbero esserci miliardi di possibilità di come la fase precedente ti ha portato a quel valore. Nessun problema: scegline uno e passa alla fase successiva; stesso affare. Dopo diverse tappe si raggiunge un punto in cui si rimane bloccati e non si può andare oltre; hai raggiunto uno stato intermedio impossibile. Quindi devi tornare indietro e fare una scelta diversa ei tuoi miliardi iniziano a moltiplicarsi. Se ci sono abbastanza stadi, questo diventa più difficile che forzare brutalmente gli input, quindi potresti farlo semplicemente.

La distruzione delle informazioni non impedisce all'aggressore di trovare le pre-immagini più velocemente della forza bruta.Ad esempio, prendi [MD5] (https://security.stackexchange.com/a/225227/86735)
rexkogitans
2020-08-12 13:22:47 UTC
view on stackexchange narkive permalink

Tutte le altre risposte sono tutte corrette e coprono alcuni aspetti, tuttavia voglio mostrare un altro approccio.

Quello che tu - più o meno casualmente - hai scoperto è l'inevitabile connessione tra funzioni hash e il principio dei casellari .

Se guardi le definizioni, è abbastanza ovvio:

  • Una funzione hash è una mappatura da un dominio contenente dati di dimensione arbitraria su dati (un array di bit) di dimensione fissa.
  • Il principio della casella dice: se ce ne sono di più piccioni che buchi, quindi deve esserci almeno un buco con almeno due piccioni all'interno.

Per il dominio di input, potresti avere password più lunghe e di lunghezza variabile, e il set di simboli è tipicamente più grande (lettere minuscole e maiuscole, cifre, alcuni simboli). Questi sono i piccioni.

Il numero di possibili valori hash è facile da calcolare: se la lunghezza è n su b simboli, allora ci sono b ^ n possibili hash (puoi impostare b = 2 per contare bit). Queste sono le buche dei piccioni.

Quindi, hai più piccioni (possibili dati di input) che buche (possibili valori hash), quindi deve esserci almeno un piccione ( possibili dati di input) inseriti in (mappati su) un buco (un valore hash).

Ovviamente in questo caso la funzione non è mai iniettiva, e quindi non biiettiva, e quindi non invertibile.

"Non invertibile" non significa che non puoi trovare * un * input con un dato output.
@user253751 Per "non invertibile" intendo il senso matematico, strettamente formale, poiché in g è la [funzione inversa] (https://en.wikipedia.org/wiki/Inverse_function) di f se e solo se g (f (x)) = x per tutte le x del dominio di input.Tale funzione g non esiste se f non è biiettiva.Ovviamente la forza bruta è sempre possibile.
Martijn
2020-08-12 13:38:46 UTC
view on stackexchange narkive permalink

È troppo per un commento, quindi lo aggiungerò come risposta:

Un piccolo trucco che potrebbe aiutare: supponiamo che il tuo algoritmo sia $ a * $ b , se hai 3 e 4, ottieni 3 * 4 = 12 . Ora hai il risultato che non puoi invertire (era 1&12, 2&6, 3&4, 4&3, 6&2 o 12&1?), Ma ha più collisioni. In questo caso 6 diversi input risulterebbero nello stesso risultato, quindi abbiamo 6 collisioni.

Un 'trucco' per ridurre al minimo questa possibilità (che non sarà mai zero se hai un numero finito di caratteri del risultato hash) sta aggiungendo più bit. Ciò significa che il risultato sarà, ad esempio, 1862534 per 3&4 come input e 2&6 potrebbe diventare 6793439 .

Martin Rosenau
2020-08-14 23:32:44 UTC
view on stackexchange narkive permalink

Supponiamo di avere un algoritmo di hashing separato chiamato s2 e che converte Hello in dug84nd8.

.. una stringa come 8GN492MD che produrrebbe anche dug84nd8 ...

Ciò che descrivi è una "collisione hash".

E sì: in questo caso sia Hello che 8GN492MD verrebbero accettate come password valide.

Mi sembra che mi manchi qualcosa , ma non so cosa sia.

Primo:

non hai scritto che l'attaccante conosce il valore hash ( dug84nd8 codice>). Tuttavia, sembra ovvio che volevi scriverlo.

Secondo:

ipoteticamente sarebbe sempre possibile trovare una stringa come 8GN492MD che ha dug84nd8 come output se si dispone di una potenza di calcolo sufficiente (forse un grande computer quantistico).

Tuttavia, le funzioni utilizzate per calcolare la stringa 8GN492MD dalla stringa dug84nd8 sono le cosiddette "funzioni unidirezionali".

Queste sono funzioni che possono essere calcolate abbastanza facilmente su un computer "normale"; tuttavia, non è noto se sia possibile calcolare la funzione inversa (trovare la stringa 8GN492MD quando la stringa dug84nd8 è nota) in un tempo realistico (ad esempio meno di 10 anni).

E ovviamente non si sa nemmeno come farlo se fosse possibile.

In effetti, a volte capita che qualche matematico trovi un modo come trovare una collisione. Ciò significa che il matematico trova un modo per trovare la stringa Hello o 8GN492MD quando viene fornita la stringa dug84nd8 .

Se questo accade, non puoi più usare la funzione hash (la funzione che calcola il valore dug84nd8 dal valore Hello ) e devi sostituire la funzione hash con un'altra . Altrimenti avrai un problema di sicurezza.

clockw0rk
2020-08-13 14:12:27 UTC
view on stackexchange narkive permalink

Altri hanno menzionato l'uso dei termini "ingegneria inversa" e "attacco" ecc., quindi non risponderò a questo. Ma per la tua domanda:

considera hash (a) = x;

Ora conosci x . Supponiamo che tu abbia accesso a un'immensa potenza di calcolo, come una botnet o forse una gigantesca server farm. Ora, in teoria, potresti iniziare a produrre hash, cioè hash (b) = y; hash (c) = z e così via. Con abbastanza tempo, potresti probabilmente trovare una funzione hash (something) = x . Quindi, in un certo senso, confronteresti gli output l'uno con l'altro finché non trovi una coppia corrispondente.

Personalmente non so quanto tempo ci vorrebbe, ma penso che sarebbe possibile. Ma immagino che ci siano modi migliori per rubare una password, come un tentativo di ingegneria sociale, o intromettersi sulla macchina del client piuttosto che sul server.

Hai spiegato l '"attacco di collisione" che è già coperto da altre risposte.
intendo tornare indietro nell'algoritmo per trovare una corrispondenza
"Andare all'indietro nell'algoritmo" non è una cosa che accade più di quanto lo sia "Solo inversione di entropia".
Zsolt Szilagy
2020-08-14 22:26:05 UTC
view on stackexchange narkive permalink

Ci sono molte ottime risposte tecniche. Cercherò di fornire qualcosa di più accessibile: un esempio.

Immagina, il mio algoritmo segreto è questo:

  • Prendo un numero di input,
  • aggiungi tutte le cifre,
  • moltiplica la somma per ogni cifra,
  • quindi ripeti il ​​processo.

Quindi 234 sarebbe (2 + 3 + 4) + 2 * 3 * 4 = 216. (2 + 1 + 6) * 2 * 1 * 6 = 108. Quello 108 è l'hash. Con la tua comprensione del mio algoritmo , puoi calcolare un numero che finisce per essere 108? Se non puoi, devi indovinare. Sembra facile qui, ma immagina che questi numeri siano lunghi migliaia di cifre ...

Disclaimer: faccio schifo in matematica, probabilmente puoi davvero decifrare quello. SHA è un'altra bestia.

slebetman
2020-08-12 10:51:26 UTC
view on stackexchange narkive permalink

La maggior parte degli algoritmi di hashing sono unidirezionali perché se inverti il ​​funzionamento degli algoritmi di hashing funzionerà anche come un algoritmo di hashing (forse non buono).

Supponiamo ad esempio di avere un algoritmo chiamato SHA256 () . E poi si implementa una funzione con esattamente l'operazione inversa chiamata REVERSE_SHA256().

Quello che accadrà è che l'output di REVERSE_SHA256 (SHA256 (INPUT)) non corrisponderà a INPUT:

  INPUT = "some string" HASH = SHA256 (INPUT); OUTPUT = REVERSE_SHA256 (HASH); OUTPUT! = INPUT  

Non solo, ma per una funzione di hashing crittograficamente sicura, OUTPUT non può essere rielaborato allo stesso valore:

  HASH2 = SHA256 (OUTPUT); HASH2! = HASH  

Che un tale algoritmo possa esistere è il motivo per cui esistono funzioni di hashing crittografico.

Non penso che questo risponda alla domanda, perché OP ha chiesto esplicitamente di generare una stringa che risulti nello stesso hash, quindi `HASH2! = HASH` contraddice l'ipotesi dell'OP.OP inoltre non ha menzionato il semplice ripristino della sequenza di operazioni dell'algoritmo di hashing.
@RaimundKrämer Risponde alla parte in cui l'OP vuole generare la stringa semplicemente invertendo le operazioni della funzione di hashing.Tu ed io comprendiamo che questo non è possibile - che l'unico modo per generare una stringa del genere è provare tutte le stringhe possibili finché non ne trovi una con lo stesso hash.L'OP non capisce che possono esserci algoritmi che non sono reversibili anche quando si invertono le operazioni dell'algoritmo.
SHA256 (REVERSE_SHA256 ("Some hash")) deve essere "Some hash" per definizione.Non puoi dire che SHA256 (REVERSE_SHA256 (HASH))! = HASH perché allora la tua funzione REVERSE_SHA256 è *** rotta *** (come in, non funziona).
Che cosa significherebbe per una funzione essere "unidirezionale"?Non iniettiva?Le funzioni non iniettive non risolvono la domanda di OP.
@user253751 Questo è il punto centrale della mia risposta.Il fatto che la costruzione di una funzione inversa proposta dall'OP non funzionerà, ovvero la funzione inversa è necessariamente interrotta.L'OP presume che ci sia un modo per invertire l'hash mediante il reverse engineering dei meccanismi alla base della generazione dell'hash.Sto tentando di dimostrare che per alcuni algoritmi, in particolare gli algoritmi che consideriamo funzioni hash crittografiche, tale ingegneria inversa porta a risultati senza senso.
@slebetman Per prima cosa dici che `REVERSE_SHA256 (SHA256 (INPUT))! = INPUT` che è abbastanza giusto.(Non lo mostri, in realtà, ma lo * dici *).Quindi dici che `SHA256 (REVERSE_SHA256 (HASH))! = HASH` che è chiaramente errato.Una stringa non ha più di un hash SHA256.
Primo: "Se trovo una stringa il cui hash è lo stesso hash di ciao, potrebbe non essere ciao" - vero.Secondo: "Se trovo una stringa il cui hash è abcdef012345, il suo hash non è abcdef012345."- falso.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 4.0 con cui è distribuito.
Loading...