Come posso creare una password che dice "SALT ME!" quando hash?

75

Come posso creare una password, che con l'hash diretto (senza sale) con md5 restituirà una stringa contenente gli 8 caratteri "SALT ME!". La speranza è che uno sviluppatore ingenuo che sfoglia il suo database di utenti vedrà l'hash, realizzerà l'insicurezza della sua applicazione e alla fine renderà il mondo un posto migliore per tutti.

Md5 emette 128 bit, ovvero 16 byte. Se avessi un messaggio a 16 byte, ottenere la password originale in chiaro sarebbe equivalente a una pre-immagine, che a mia conoscenza è praticamente impossibile. Tuttavia, sto cercando solo 8 byte specifici nel mio hash.

Ottenere una password del genere è fattibile in un frame temporale di un tipico computer? In tal caso, come posso calcolare una password di questo tipo?

    
posta Joel 22.04.2014 - 18:29
fonte

3 risposte

256

L'output di MD5 è binario: una sequenza di 128 bit, comunemente codificati come 16 byte (tecnicamente, 16 ottetti , ma usiamo la convenzione comune dei byte come ottetti).

Gli umani non leggono bit o byte. Leggono caratteri . Esistono numerose code page che indicano come codificare i caratteri come byte e, analogamente, decodificare i byte in caratteri. Per quasi tutti (a causa di ASCII ), i byte di valore basso (da 0 a 31) sono "caratteri di controllo" , quindi non veramente rappresentabili come personaggi. Quindi nessuno legge realmente l'output MD5 direttamente. Se qualcuno sta "leggendo" i valori hash, questi valori sono probabilmente codificati in caratteri usando una delle poche convenzioni comuni per quello. Le due convenzioni più diffuse sono esadecimale e Base64 .

Con esadecimale, ci sono solo cifre e lettere da "a" a "f" (tradizionalmente minuscole per valori hash). Non otterrai "SALT ME!" in un output esadecimale ...

Con Base64, la codifica utilizza tutte e 26 le lettere latine non accentate (sia minuscole che maiuscole), le cifre e i segni "+" e "/". Potresti così sperare in "SaltMe" o "SALTME". Ora che è fattibile, poiché ogni carattere in Base64 codifica 6 bit, quindi un'uscita di 6 lettere corrisponde solo a 36 bit. Alla ricerca di una password che produca "SaltMe" o "SALTME" verrà eseguito in (in media) 2 35 tentativi, ovvero entro pochi minuti o ore con qualche decente codice ottimizzato.

Si noti, tuttavia, che qualcuno che spende un po 'di tempo per leggere i valori hash codificati Base64 probabilmente ha alcuni, diciamo, "problemi sociali", e come tale potrebbe non reagire nel modo in cui si spera.

Ed è fatto: quando esegui l'hashing con MD5 e poi Base64-codifica il risultato:

  • infjfieq rese: SALTMEnBrODYbFY0c/tf+Q==
  • lakvqagi rese: SaltMe+neeRdUB6h99kOFQ==
risposta data 22.04.2014 - 18:59
fonte
5

Puramente in teoria ...

Ci sono tabella arcobaleno set con hash precalcolati. Puoi cercarlo per un valore hash che contenga i valori di byte adatti (EDIT: richiederebbe una forzatura bruta di pre-generare gli hash e il sondaggio completi, il che rende molto più difficile da fare - vedi commento di bonsaiviking alla risposta), se ne esiste uno (ad esempio uno che contiene 0xBADBAD). Se ne esiste uno, quindi dalla stessa tabella dell'arcobaleno è possibile recuperare il testo in chiaro da cui è stato derivato l'hash (e se si utilizza tale password, quindi, per definizione, non è sicuro come chiunque possa ottenere il database in grado di invertirlo, e quindi non consigliato)

In pratica, comunque ....

Ci sono molti presupposti in questo approccio.

  • Nelle organizzazioni di dimensioni ragionevoli, gli sviluppatori in genere non hanno accesso al database di produzione, ad eccezione forse di singoli casi di risoluzione dei problemi.
  • Si presume che MD5 sia memorizzato / visualizzato in un formato leggibile dall'uomo; tuttavia è solo una matrice di byte di 16 byte, e dipenderebbe davvero dal software che lo sviluppatore / IT-persona utilizzerebbe per visualizzarlo. Ad esempio, in Visual Studio, il debugger visualizza l'array di byte in genere in base al suo valore numerico, ad es. 87,45,34,67, ...
  • Si presume che venga utilizzato MD5 non salato, ma potrebbe essere un'altra funzione di hashing, per cui l'hash sarebbe, ovviamente, diverso e quindi non soddisferà i requisiti.
  • E come altri già suggerito, non sai come viene memorizzato poiché potrebbero esserci state applicate alcune trasformazioni aggiuntive (come Base64, ad esempio) che lo avrebbero reso diverso.

Ma in primo luogo la più grande ipotesi è che qualcuno stia esaminando il database di migliaia / decimilles / milioni / dieci milioni / etc di utenti e individuerebbe il valore dispari di un gruppo di hash, e anche in quel caso da una parte di un hash.

    
risposta data 22.04.2014 - 19:07
fonte
1

8 byte è a 64 bit, che va oltre la bruteforce. Non conosco alcun attacco preimage su MD5, quindi probabilmente sei sfortunato.

Inoltre, alcuni siti Web sfuggono o restringono il tuo charset come misura (inefficace) contro SQLI

    
risposta data 22.04.2014 - 18:41
fonte

Leggi altre domande sui tag