Proverò un approccio diverso per rispondere a questa domanda. Non ti dirò che qualcosa è brutto e non ti spiegherò perché. Spiegherò esattamente perché è brutto, passo dopo passo, e ti mostrerò come romperlo, ma non entrerò troppo in profondità nei Rainbow Tables ... si presume che tu sappia cosa è.
Ecco perché l'hash del tuo sviluppatore non è corretto: perché introduce solo alcuni fattori che potrebbero essere completamente forzati una volta che il metodo viene scoperto, anche se dovesse randomizzare il mescolamento.
Come? Perché se ho accesso al tuo server, conosco anche il metodo che il tuo sviluppatore sta usando per hash la tua password perché ho rubato anche quel codice e posso riorganizzare tutto per adattarlo alla mia piccola applicazione pazza.
Diciamo che ho violato la tua azienda e ho ottenuto l'accesso al tuo database in modo da poter ottenere questi hash. So QUANDO gli utenti si registrano, corretto? So quando hanno cambiato la password l'ultima volta perché, a meno che tu non sia un principiante completo, dovresti registrare queste informazioni nel database.
$ time = date ('mdYHis');
Questo timestamp è probabilmente più o meno nello stesso momento in cui l'utente ha registrato la propria password o l'ha modificata. Possiamo saperlo perché l'ultima volta che è stato aggiornato dovrebbe essere memorizzato nel database. L'ora in cui ti sei registrato dovrebbe essere memorizzata nel database. Parte della cripta è stata sconfitta.
$ rand = mt_rand (). '\ n';
Fantastico, un generatore di numeri casuali. Sai, niente è veramente casuale sui computer. I generatori di numeri casuali non sono veramente casuali. Questo è il Mersenne Twister
. Tutto ciò di cui ho bisogno sono 624
diverse combinazioni per capire tutti i numeri futuri. Ho anche rubato il tuo "sale" dal database e so come lo stai calcolando.
Poiché conosco le date in cui i tuoi utenti si sono registrati, so come ricreare il numero corretto per la routine Mersenne Twister in quel momento specifico. Posso scrivere un piccolo metodo di cracking per estrarre il numero esatto che probabilmente sarebbe accaduto in quel momento. Il tuo sale non è più casuale. Ma sai cosa? È irrilevante. Conosco il formato esatto che stai usando per quel sale e probabilmente l'ho preso comunque dal tuo database. Quindi posso usare Rainbow Tables per annientare completamente il tuo sale in meno di un secondo perché mt_rand ()
da solo produce un massimo di 10 ^ 10
hash e un minimo di 10 ^ 9
, che significa 11 miliardi di possibilità, e poiché sono tutti numeri e conosco il formato del tuo sale, verranno decifrati in meno di un secondo.
Quindi ora So a chi appartiene questo nome utente perché ho collegato il tuo database. So quando si sono registrati, so quando hanno cambiato la password l'ultima volta e conosco il tuo numero casuale. Ti vedo, Dave, un ladro sul tetto. Il mio nuovo collegamento satellitare ha sia lo spettro a infrarossi che quello a raggi X. Vedo il tuo cuore battere. Vedo che hai paura.
Ora che $ crypt
è stato sconfitto, diamo un'occhiata alla function hash_it ()
.
funzione hash_it ($ stringa1, $ stringa2) {$ pass = md5 ($ stringa1); $ nt = substr ($ passaggio, 0,8); $ th = substr ($ pass, 8,8); $ ur = substr ($ passaggio, 16,8); $ ps = substr ($ passaggio, 24,8); $ hash = 'H'.sha1 ($ stringa2. $ ps. $ ur. $ nt. $ th); return $ hash}
Ora diamo un'occhiata ad alcuni input di esempio: hash_it (Dave, testpassword1);
Risultati:
$ pass = "b7e055c6165da55c3e12c49ae5207455" $ nt = "b7e055c6"; $ th = null; $ ur = "3e12c49a"; $ ps = "e5207455";
$ hash Input
: "H" + "nome utente +" RegistrationDate "+" 1604716014 "+" e5207455 "+" 3e12c49a "+" b7e055c6 "(tldr: "HDaveRegistrationDate1604716014e52074553e12c49ab7e055c6"
)
$ hash = 'H'.sha1 ("DaveRegistrationDate1604716014e52074553e12c49ab7e055c6);
` $ hash output : "6b347a1521b6b84501806268614abe1e7324c703" tempo)
Ecco come potrebbe funzionare un attacco :
- Rompi Mersenne Twister (
mt_rand ()
) dopo 624 osservazioni, o semplicemente Rainbow Table the salt. - Prendi la
REGISTRATION_DATE
di Dave dal database o la USER_LAST_MODIFIED_DATE
- Prendi la SHA1 di Dave hash
- Avvia un attacco di forza bruta (diventa un hash sha1 statico dopo aver infranto la tua "sicurezza") con i seguenti parametri:
-
"Username"
+ "RegistrationDate"
+ YourRandomNumber
+ DictionaryAttack[”
- Danneggia i tuoi clienti.
E questa è la storia del motivo per cui non dovresti lanciare la tua crittografia a meno che tu non sappia veramente cosa stai facendo. Immagina se fossi un vero cracker, e non è così uno che è appena tornato indietro nel codice.