Se conosco il testo originale "12345" che codifica su "Tut0nlFFZ9sLVhPE5x81lQ ==", come posso identificare l'algoritmo di hashing?
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!
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.
Stai usando hashing e codifica e crittografia allo stesso tempo per la stessa cosa, mentre sono cose completamente diverse. In poche parole:
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.
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:
827ccb0eea8a706c4c34a16891f84e7b
e l'hash SHA1 è 8cb2237d0679ca88db6464eac60da96345513964
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:
base64(md5($text))
) - la decodifica degli schemi comuni può essere ottenuta con uno dei tanti strumenti disponibili gratuitamente
gnzLDuqKcGxMNKFokfhOew==
sha1(md5($text))
): individua uno alla volta fino a quando viene rilevato l'ultimo È 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.
Leggi altre domande sui tag hash