Posso determinare quale algoritmo è stato usato se conosco l'hash di corrispondenza di un dato input?

7

Se conosco il testo originale "12345" che codifica su "Tut0nlFFZ9sLVhPE5x81lQ ==", come posso identificare l'algoritmo di hashing?

    
posta Prince5 22.02.2013 - 10:11
fonte

5 risposte

7

All'osservazione sembra una codifica base64 (nota che questo non è un hash, è una stringa codificata). Posso dire questo perché so che questo algoritmo di hashing riempie la fine della stringa con = se necessario. Altri segni rivelatori possono derivare dall'uso di determinati caratteri nella stringa. Questi apprenderanno semplicemente esponendo te stesso agli esempi esistenti e leggendo i vari algoritmi di codifica là fuori.

La stringa codificata in base 64 di 12345 è in realtà MTIzNDU= , non ciò che hai fornito. Decodifica della resa della stringa fornita: NëtžQEgÛVÄç5• . L'alta entropia qui indica che questo è probabilmente il risultato di qualche algoritmo di crittografia. Poiché il punto di un buon algoritmo di crittografia è l'impossibilità di determinarlo da dati casuali, non è spesso semplice scoprire quale algoritmo è stato utilizzato e normalmente si dovrebbe ricorrere a sforzi di forza bruta.

Supponendo che questo sia un tipo di esercizio in cui sei sicuro che il tuo input si risolva e ti è stato chiesto di determinare la password utilizzata per crittografarlo, puoi eseguire la brute-force usando un metodo che dopo aver provato una password controlla per vedere se l'output è effettivamente 12345 . In questo modo puoi effettivamente verificare di aver indovinato la password corretta. Buona fortuna!

    
risposta data 22.02.2013 - 10:23
fonte
5

Il "valore crittografato" è Base64 : questa è una codifica per byte arbitrari in caratteri stampabili . In Base64, ogni tre byte di input diventano quattro caratteri; i possibili caratteri sono lettere (maiuscole e minuscole), cifre, "+" e "/". Inoltre, potrebbero esserci uno o due segnali "=" finali in modo che la lunghezza totale sia un multiplo di 4. Questi segni "=" sono un omaggio morto di Base64.

Nel tuo caso, il "valore crittografato" è la codifica Base64 di una sequenza di 16 byte. Questi 16 byte, in esadecimale, sarebbero 4eeb749e514567db0b5613c4e71f3595 . Nel contesto delle funzioni hash, 16 byte generalmente significano MD4 o MD5. Ma ci sono molte varianti possibili. Ad esempio, se quel "valore crittografato" appare in un "database di utenti" (ad esempio una password hash), allora è abbastanza probabile che l'input sia in qualche modo "salato" con altri campi specifici dell'utente. Per verificarlo, prova a fornire la stessa password a due utenti distinti; se ottengono hash distinti, viene applicata la salatura (eventualmente con il nome utente o qualche altro campo).

Tali valori non appaiono da soli; si trovano in un contesto : lo hai trovato in un file o database, collegato a qualche applicazione o software server. Indizi sul tipo di crittografia della funzione di hash si trovano in quel contesto.

    
risposta data 22.02.2013 - 13:39
fonte
2

Stai usando hashing e codifica e crittografia allo stesso tempo per la stessa cosa, mentre sono cose completamente diverse. In poche parole:

  • hashing = > Un modo irreversibile
  • encrypting = > reversibile ma protetto in modo sicuro
  • codifica protetta = > reversibile senza protezione

Il modo migliore per scoprirlo è prendere tutti i diversi algoritmi e hash / codificare il testo in chiaro e vedere quale delle corrispondenze di output. Ho la netta sensazione che la codifica sia BASE64. Ora potrebbe essere che quello che hanno fatto è: BASE64 (hash (x)), quindi la soluzione migliore è decodificare il BASE64, prendere la rappresentazione binaria e confrontarla con diversi risultati di hashing della stringa di testo semplice.

    
risposta data 22.02.2013 - 10:25
fonte
0

Prima di tutto, permettimi di sottolineare che Tut0nlFFZ9sLVhPE5x81lQ== è una base64 codifica della stringa "NtQEgV5" e non un valore risultante da una funzione di hashing.
In secondo luogo, dal momento che la tua domanda suggerisce che la differenza tra encryption e hashing non è chiara, ti suggerisco di dare un'occhiata a queste due domande su SO prima di approfondire l'argomento ( one e due ).

Tornando alla domanda, al fine di rilevare quale funzione di hashing è stata utilizzata, è possibile dare un'occhiata al valore hash poiché gli algoritmi di hashing solitamente hanno un output a lunghezza fissa. Ad esempio, MD5 produce un valore a 128 bit (32 caratteri esadecimali), mentre SHA1 produce un valore a 160 bit (40 caratteri esadecimali). Vediamolo in azione:

  • L'hash MD5 di "12345" è 827ccb0eea8a706c4c34a16891f84e7b e l'hash SHA1 è 8cb2237d0679ca88db6464eac60da96345513964
  • L'hash MD5 di "1234567890" è e807f1fcf82d132f9bb018ca6738a19f e l'hash SHA1 è 01b307acba4f54f55aafc33bb06bbbf6ca803e9a .

Come puoi vedere, gli hash hanno la stessa lunghezza di quelli calcolati sulla stringa più corta.

Anche se hai accesso sia al testo libero che al suo valore hash, trovare l'algoritmo usato potrebbe non essere così semplice come sembra.

Se l'implementazione utilizza un singolo algoritmo di hashing (che è pratica comune), rilevare quello giusto è banale e può essere fatto con applicazioni disponibili gratuitamente (ad esempio MD5Decrypter ). Tieni presente che alcune applicazioni potrebbero implementarlo in modo diverso:

  • codifica gli hash prima di salvarli (ad esempio base64(md5($text)) ) - la decodifica degli schemi comuni può essere ottenuta con uno dei tanti strumenti disponibili gratuitamente
    • es. l'hash MD5 di "12345" codificato in Base64 è gnzLDuqKcGxMNKFokfhOew==
  • algoritmi di hashing multipli (ad esempio sha1(md5($text)) ): individua uno alla volta fino a quando viene rilevato l'ultimo
  • un sale può essere utilizzato per rafforzare gli hash contro gli attacchi - è ancora possibile rilevare l'algoritmo di hash utilizzato, ma il semplice hashing del testo non restituirà lo stesso valore
  • mentre contro le migliori pratiche, un'applicazione può mettere in mostra un algoritmo personalizzato usato per memorizzare le informazioni - la difficoltà nel determinare come viene manipolata la stringa di testo trasparente dipende interamente dall'implementazione personalizzata

È anche possibile scoprire quale algoritmo viene utilizzato conoscendo la tecnologia sottostante: le password di Windows possono essere hash LM o NTLM, le credenziali trovate in un database MySQL possono essere (poco comuni) hash con la funzione PASSWORD () di MySQL, ecc.

    
risposta data 22.02.2013 - 20:00
fonte
0

C'è più di un modo per generare un simile output. Uno strumento che potrebbe aiutarti in un modo più generico per questo compito, si chiama Codetective: link

P.S .: Potrei essere di parte: P

    
risposta data 23.02.2013 - 12:04
fonte

Leggi altre domande sui tag