it-swarm.dev

Come determinare quale tipo di codifica / crittografia è stata utilizzata?

C'è un modo per trovare quale tipo di crittografia/codifica viene utilizzato? Ad esempio, sto testando un'applicazione Web che archivia la password nel database in un formato crittografato (WeJcFMQ/8+8QJ/w0hHh+0g==). Come determinare quale hashing o crittografia viene utilizzato?

156
Karthik

La tua stringa di esempio (WeJcFMQ/8+8QJ/w0hHh+0g==) è la codifica Base64 per una sequenza di 16 byte, che non sembrano significativi ASCII o UTF-8. If questo è un valore memorizzato per la password - verifica (cioè non proprio una password "crittografata", piuttosto una password "con hash") quindi questo è probabilmente il risultato di una funzione hash calcolata sulla password; l'unica classica funzione hash con output a 128 bit è MD5, ma potrebbe riguardare qualsiasi cosa.

Il modo "normale" di sapere è guardare il codice dell'applicazione. Il codice dell'applicazione è incarnato in modo tangibile e grasso (file eseguibili su un server, codice sorgente da qualche parte ...) che non è, e non può essere, protetto quanto una chiave segreta. Quindi il reverse engineering è la "strada da percorrere".

Salvo il reverse engineering, puoi fare alcuni esperimenti per provare a fare ipotesi colte:

  • Se lo stesso utente "modifica" la sua password ma la riutilizza, cambia il valore memorizzato? Se sì, allora parte del valore è probabilmente un "salt" randomizzato o IV (presupponendo una crittografia simmetrica).
  • Supponendo che il valore sia deterministico dalla password per un determinato utente, se due utenti scelgono la stessa password, si ottiene lo stesso valore memorizzato? In caso contrario, il nome utente fa probabilmente parte del calcolo. Puoi provare a calcolare MD5 ("nome utente: password") o altre varianti simili, per vedere se ottieni una corrispondenza.
  • La lunghezza della password è limitata? Vale a dire, se imposti una password di 40 caratteri e non riesci a eseguire l'autenticazione digitando solo i primi 39 caratteri, significa che tutti i caratteri sono importanti e ciò implica che si tratta in realtà di una password hashing, no - crittografia (il valore memorizzato viene utilizzato per verificare una password, ma la password non può essere recuperata dal solo valore memorizzato).
140
Thomas Pornin

Modifica: ho appena notato uno script molto interessante chiamato hashID . Il nome praticamente lo descrive.

~~~

In generale, usare l'esperienza per fare ipotesi educate è come queste cose vengono fatte.

Ecco un elenco con un numero molto grande di output hash in modo che tu sappia come ognuno di essi appaia e crei firme/schemi o semplicemente verifichi otticamente.

Ci sono due principali cose a cui prima fai attenzione:

  • la lunghezza dell'hash (ogni funzione hash ha una lunghezza di output specifica)
  • l'alfabeto utilizzato (sono tutte lettere inglesi? numeri 0-9 e A-F così esadecimali? quali caratteri speciali ci sono?)

Diversi programmi di cracking delle password (ad esempio John the Ripper) applicano alcuni pattern matching sull'input per indovinare l'algoritmo utilizzato, ma questo funziona solo su hash generici. Ad esempio, se si prende un output hash e si ruota ogni lettera di 1, la maggior parte degli schemi di corrispondenza dei modelli fallirà.

68
john

Ciò che hai pubblicato sono 16 byte (128 bit) di dati codificati in base 64. Il fatto che sia codificato in base 64 non ci dice molto perché la base 64 non è un algoritmo di crittografia/hashing, è un modo per codificare i dati binari in testo. Ciò significa che questo blocco include un'informazione utile, vale a dire che l'output è lungo 16 byte. Possiamo paragonarlo alla dimensione del blocco degli schemi comunemente usati e capire cosa non può essere. Di gran lunga gli schemi più comuni sono:

La prossima cosa che dobbiamo fare è guardare altri blocchi di testo cifrato per capire la risposta alla seguente domanda:

  • Tutti i testi cifrati hanno la stessa lunghezza, anche per lunghezze di input diverse?

Se non tutti i blocchi hanno la stessa lunghezza, allora non stai osservando un algoritmo di hashing, ma uno di crittografia. Poiché l'output sarà sempre un multiplo della dimensione del blocco sottostante, la presenza di un blocco che non è uniformemente divisibile per 16 byte significherebbe che non può essere AES e quindi deve essere DES o 3DES.

Se hai la possibilità di inserire una password e osservare l'output, questo può essere determinato molto rapidamente. Inserisci una password di 17 caratteri e osserva la lunghezza. Se i suoi 16 byte hanno MD5, 20 byte significa SHA-1, 24 byte significa DES o 3DES, 32 byte significa AES.

26
Yaur

Se si tratta in effetti di un semplice hash di password, potremmo essere in grado di tilizzare Google per decifrarlo . Base64 è difficile da cercare, tuttavia, con tutte quelle barre e segni più, quindi prima convertiamo l'hash in esadecimale:

$ Perl -MMIME::Base64 -le 'print unpack "H*", decode_base64 "WeJcFMQ/8+8QJ/w0hHh+0g=="'
59e25c14c43ff3ef1027fc3484787ed2

OK, ora possiamo Google for it . Al momento, sto ricevendo solo un colpo , da md5this.com - anche se ovviamente ce ne saranno presto altri, incluso questo post.

Sfortunatamente (o forse per fortuna, a seconda della tua prospettiva), non siamo abbastanza fortunati da trovare effettivamente un pre-immagine (il sito attualmente elenca questo hash come "cracking ..."), ma il fatto che sia in quella lista non lo fa affatto suggerisco fortemente che si tratta effettivamente di un hash MD5 non salato di una vera password.

6
Ilmari Karonen

Dipende dal formato: alcuni protocolli per l'archiviazione del testo crittografato hanno una parte in chiaro che definisce come è crittografato. Dal tuo esempio, sono dubbioso poiché la stringa a cui fai riferimento è così breve che sembra essere solo il testo crittografato.

Suggerirei un paio di pensieri:

  • Il "==" alla fine sarebbe sicuramente il riempimento, quindi non includerlo in nessun tentativo di decrittazione.

  • Potresti avere a che fare con un hash o un hash salato, piuttosto che con la crittografia. In tal caso, il tentativo di "decrittografare" i dati non funzionerà: è necessario abbinare le password utilizzando lo stesso hash e/o il valore salt utilizzato in origine. Non è possibile utilizzare una password salata per ottenere il valore originale.

  • La tua scommessa migliore in assoluto è ottenere una copia del codice utilizzato per memorizzare le password. Da qualche parte lì dentro, le password stanno subendo un'operazione crittografica. Trova il codice per sapere cosa sta succedendo qui. 9 volte su 10, stanno usando una sorta di API per l'hash/salting/crittografia e puoi imitarla o invertirla usando la stessa API.

6
bethlakshmi

La codifica può generalmente essere indovinata. Ad esempio, la stringa che hai pubblicato nella tua domanda è codificata Base64. I segni di uguale sono il riempimento nello schema Base64. È qualcosa che conosco a vista per esperienza.

Se mi hai dato una stringa crittografata, potrei essere in grado di dirti la codifica, ma non posso dirti l'algoritmo utilizzato per crittografarlo a meno che non sia disponibile una sorta di metadati. Il motivo è questo: gli algoritmi di crittografia funzionano producendo quelli che sembrano essere dati casuali. Se avessi crittografato due frasi ciascuna con due cifre (quattro uscite), non saresti in grado di dirmi con fiducia quale testo cifrato appartenesse a quale cifra a meno che tu non lo decifrasse o rompesse la cifra.

Per quanto riguarda la tua specifica istanza, le password sono generalmente sottoposte a hash. Ciò significa che non è possibile recuperare la password dall'hash, ma è possibile verificare se l'hash corrisponde alla password. A tal proposito, la risposta di @ john è d'oro. Se puoi inserire una password che conosci e quindi provare schemi comuni contro di essa, puoi imparare qual è l'hash utilizzato.

6
Jeff Ferland

L'unico modo è indovinare. Con l'esperienza, supponiamo che le opere saranno più corrette.

Ad esempio: in base alla lunghezza dell'output: l'output MD5 è di 128 bit o 16 byte, l'output SHA1 è di 160 bit o 20 byte. Basato sul set di caratteri di output: BASE64 produce output con caratteri stampabili.

Alla fine della giornata, è l'approccio di prova ed errore che ti insegna come.

4
Nam Nguyen

Questa è una sicurezza molto debole su tutti i fronti! Il testo in chiaro è P4 $$ w0rdP4 $$ w0rd ed è crittografato usando XOR, con la chiave CdZ4MLMPgYtAE9gQ80gMtg ==. Questo produce il testo cifrato pubblicato dall'OP sopra, WeJcFMQ/8 + 8QJ/w0hHh + 0g ==.

Verificare:

Innanzitutto, usa xxd per ottenere il binario sottostante del testo in chiaro:

echo -n 'P4$$w0rdP4$$w0rd' | xxd -b -c16

Questo produce:

01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100

Quindi, base64-decodifica la chiave e usa xxd per ottenere il binario sottostante della chiave:

echo -n 'CdZ4MLMPgYtAE9gQ80gMtg==' | base64 -d | xxd -b -c16

Questo produce:

00001001 11010110 01111000 00110000 10110011 00001111 10000001 10001011 01000000 00010011 11011000 00010000 11110011 01001000 00001100 10110110

Ora, XOR le due stringhe binarie:

01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100  (plaintext)
[XOR]
00001001 11010110 01111000 00110000 10110011 00001111 10000001 10001011 01000000 00010011 11011000 00010000 11110011 01001000 00001100 10110110  (key)
-----------------------------------------------------------------------------------------------------------------------------------------------
01011001 11100010 01011100 00010100 11000100 00111111 11110011 11101111 00010000 00100111 11111100 00110100 10000100 01111000 01111110 11010010  (ciphertext)

Infine, usa bc, xxd e base64 per convertire il testo cifrato binario in base64:

echo "obase=16; ibase=2; 01011001111000100101110000010100110001000011111111110011111011110001000000100111111111000011010010000100011110000111111011010010" | bc | xxd -p -r | base64

Questo produce WeJcFMQ/8 + 8QJ/w0hHh + 0g ==, che è il testo cifrato pubblicato dall'OP nella domanda sopra.


Mi scuso se questa risposta sembra inventata. Certo che lo è. Domande simili a questa, in cui il poster fornisce solo un po 'di testo cifrato, e chiede alcune idee su come quel testo cifrato avrebbe potuto essere prodotto, sembrano sorgere abbastanza frequentemente su security.stackexchange.com; e questa domanda viene spesso citata come duplicata di quelle. Il punto di questa risposta è illustrare che domande di questo tipo sono senza risposta, perché ci sono infinite soluzioni a questo tipo di domande.

1
mti2935

L'unico modo è quando ci sono alcuni metadati che ti dicono. Ad esempio, di recente ho lavorato con i PDF e il formato include un dizionario che contiene il filtro, l'algoritmo, la dimensione della chiave ecc. Ma se tutto ciò che hai è il testo cifrato, allora tutto ciò che hai è un po 'di macchia opaca di dati.

1
user185