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

139

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

    
posta Karthik 20.05.2011 - 13:12
fonte

8 risposte

121

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

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

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

  • Se lo stesso utente "cambia" la sua password ma riutilizza lo stesso, il valore memorizzato cambia? Se sì, allora parte del valore è probabilmente un "salt" o IV casuale (assumendo la 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? Se no, allora il nome utente è probabilmente parte del calcolo. Puoi provare a calcolare MD5 ("username: 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 ad autenticarti con successo digitando solo i primi 39 caratteri, significa che tutti i caratteri sono importanti, e questo implica che questa è veramente una password hashing , non < em> encryption (il valore memorizzato è usato per verificare una password, ma la password non può essere recuperata dal solo valore memorizzato).
risposta data 23.05.2011 - 17:00
fonte
63

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

~~~

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

Ecco un elenco con un numero molto elevato di output hash in modo che tu sappia come ognuno guarda e crea firme / pattern o semplicemente verifica visivamente.

Ci sono due principali cose a cui prima presti attenzione:

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

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

    
risposta data 20.05.2011 - 13:22
fonte
24

Quello che hai postato è 16 byte (128 bit) di dati codificati in base 64. Il fatto che sia codificato in 64 base 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'utile informazione, vale a dire che l'output è lungo 16 byte. Possiamo paragonarlo alle dimensioni dei blocchi degli schemi comunemente usati e capire cosa non può essere. Gli schemi di gran lunga 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 di crittografia sono della stessa lunghezza, anche per lunghezze di input differenti?

Se non tutti i blocchi hanno la stessa lunghezza, allora non stai guardando 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 è equamente 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. Basta inserire una password di 17 caratteri e osservare la lunghezza. Se i suoi 16 byte hanno MD5, 20 byte significa SHA-1, 24 byte significa DES o 3DES, 32 byte significa AES.

    
risposta data 23.05.2011 - 05:34
fonte
6

Dipende dal formato: alcuni protocolli per la memorizzazione di testo crittografato hanno una parte in chiaro che definisce come è crittografato. Dal tuo esempio, sono dubbioso dal momento che la stringa di riferimento è talmente breve che sembra che sia solo il testo crittografato.

Suggerirei un paio di pensieri:

  • Il "==" alla fine sarà sicuramente il padding, quindi non includerlo nei tentativi di decifrazione.

  • Potresti avere a che fare con un hash o un hash salato, piuttosto che con la crittografia. In tal caso, provare a "decrittografare" i dati non funzionerà - è necessario abbinare le password usando lo stesso hash e / o il valore salt che è stato usato originariamente. Non c'è modo con una password salata per ottenere il valore originale.

  • La tua migliore scommessa è quella di 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, utilizzano una sorta di API per l'hashing / salting / encryption e puoi imitarli o invertirli utilizzando la stessa API.

risposta data 20.05.2011 - 19:47
fonte
6

La codifica può generalmente essere indovinata a. Ad esempio, la stringa che hai postato nella tua domanda è codificata Base64. I segni uguali si riempiono nello schema Base64. È qualcosa che conosco a prima vista dall'esperienza.

Se mi hai fornito una stringa crittografata, potrei essere in grado di dirti la codifica, ma non posso dirti l'algoritmo usato per crittografarlo a meno che non sia disponibile qualche tipo di metadata. Il motivo è questo: gli algoritmi di crittografia funzionano producendo quelli che sembrano dati casuali. Se avessi crittografato due frasi ognuna con due cifre (quattro uscite), non saresti in grado di dirmi con certezza quale testo cifrato apparteneva a quale cifrario a meno che non lo decifrassi o rompessi il codice.

Riguardo alla tua istanza specifica, le password di solito sono hash. Ciò significa che non è possibile recuperare la password dall'hash, ma è possibile verificare se l'hash corrisponde alla password. A tale riguardo, @ john's answer è d'oro. Se riesci a inserire una password che conosci e poi a provare schemi comuni contro di essa, puoi scoprire che cos'è l'hash utilizzato.

    
risposta data 23.05.2011 - 17:17
fonte
6

Se questo è davvero un semplice hash della password, potremmo essere in grado di usa Google per decifrare . Base64 è difficile da cercare, però, 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 per questo . Al momento, sto ricevendo solo uno premi , da md5this.com - anche se ovviamente ci sarà presto molto di più, incluso questo post.

Purtroppo (o forse per fortuna, a seconda della tua prospettiva), non siamo abbastanza fortunati da trovare effettivamente un preimage (il sito attualmente elenca questo hash come "cracking ..."), ma il fatto che sia in quella lista suggerisce strongmente che si tratta di un hash MD5 non salato di una vera password.

    
risposta data 20.10.2011 - 13:23
fonte
4

L'unico modo è indovinare. Con l'esperienza, le ipotesi di lavoro saranno più corrette.

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

Alla fine della giornata, è l'approccio try-and-error che ti insegna come.

    
risposta data 20.05.2011 - 15:01
fonte
1

L'unico modo è quando ci sono alcuni metadati che ti dicono. Ad esempio, ultimamente sto lavorando con i PDF e il formato include un dizionario contenente il filtro, l'algoritmo, la dimensione della chiave, ecc. Ma se tutto ciò che hai è il testo cifrato, allora tutto ciò che hai è un opaco blob di i dati.

    
risposta data 20.05.2011 - 15:26
fonte

Leggi altre domande sui tag