Ho paura che mi vengano lanciati pomodori per aver fatto questa vecchia domanda, ma qui va.
Dopo aver letto che la cottura del proprio hash delle password delle funzioni di hashing esistenti è pericolosa oltre e oltre di nuovo non lo faccio ancora capisco la logica Ecco alcuni esempi:
-
md5(md5(salt) + bcrypt(password))
-
scrypt(bcrypt(password + salt))
-
sha1(md5(scrypt(password + md5(salt))))
Gli argomenti tipici contro questi sono i seguenti:
You're not a cryptographer! You've got no idea if these hashes are more secure. Leave it to the experts who know what they're doing. These add no extra security.
Certo che non migliorano la funzione come un hash (cioè rendono più difficile invertire o trovare collisioni ecc.), ma sicuramente sicuramente non fanno peggio come hash? Se lo facessero allora gli hacker sarebbero in grado di ri-hash le password con hash standard in questi wacky hash come meglio credono e indeboliranno l'hash? Non lo compro.
Secondo argomento:
Kerckoffs's principle: A cryptosystem should be secure even if everything about the system is known.
D'accordo. Questa è fondamentalmente la motivazione per non archiviare le password come testo in chiaro in primo luogo. Ma se la mia risposta alla prima critica rimane allora questi wacky hash funzionano ancora come hash sicuri, e il nostro sistema non infrange il principio di Kerckoffs più di quanto farebbe con un hash standard.
Ecco due vantaggi (e vale la pena, a mio avviso) di usare un hash "strambo" su un normale hash:
- Certo, il tuo sistema dovrebbe essere sicuro se l'autore dell'attacco ha il codice sorgente, ma è molto probabile che il tuo aggressore non abbia accesso al tuo codice sorgente e probabilmente non sarà in grado di indovinare il tuo stravagante hash, rendendo impossibile qualsiasi tentativo di forza bruta.
- (Questa è la vera motivazione dietro di me a porre questa domanda)
BCrypt
è pensato per essere sicuro, difficile per CPU e GPU (ottimo) ma può essere molto veloce con hardware specializzato . Si dice cheSCrypt
sia difficile da forzare su CPU, GPU e attualmente disponibile specializzato, ma è più recente e non è considerato attendibile dalla comunità crittografica tanto quanto BCrypt a causa della mancanza di visibilità che ha avuto. Ma l'hashBCrypt(SCrypt(password + salt))
non ottiene il meglio da entrambi i mondi?
Apprezzo che la passione / rabbia dietro la maggior parte delle invenzioni contro questi hash fatti in casa provenga dalla scarsa conoscenza del programmatore medio di ciò che rende un buon hash, e una preoccupazione che incoraggiando questo tipo di hashish inevitabilmente finirà con gli hash deboli e inutili entrano nel codice di produzione. Ma Se il wacky hash è accuratamente costruito con hash solidi e affidabili, i guadagni in sicurezza non sono molto preziosi e reali?
Aggiornamento
Ho ricevuto un sacco di buone risposte su questo, grazie. Ciò che mi sembrava di trascurare nelle mie ipotesi era che, sebbene combinare gli hash non rendesse più facile crackare la password originale e quindi rompere gli hash costituenti, la combinazione di due o più hash sicuri può - almeno in linea di principio - sii più debole di uno qualsiasi dei suoi hash interiori a causa delle interazioni non studiate e complesse tra loro. Significa che potrebbe essere possibile trovare qualche stringa che ha superato l'hash stravagante senza necessariamente rompere gli hash che lo hanno inventato.