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