La sicurezza in una funzione hash non è che il meccanismo sia sconosciuto - è che la funzione hash è stata provata nel tempo per essere sicura. Ad esempio, distribuzione uniforme sullo spazio delle chiavi e proprietà crittografiche come resistenza di collisione, resistenza di preimage e seconda resistenza di preimage. L'hashing della password, la resistenza alle collisioni e le seconde proprietà di resistenza al preimage non contano: è solo la resistenza all'anteprima che è importante:
for essentially all pre-specified outputs, it is
computationally infeasible to find any input which hashes to that
output
Non è possibile dimostrare che una funzione di hash autocostruita abbia tali proprietà senza gli occhi di altri crittografi per esaminare correttamente il tuo algoritmo.
Un algoritmo di hashing sicuro non può essere annullato se viene utilizzato con un salt. L'unico modo in cui un utente malintenzionato può scoprire la password ottenendo l'hash e il suo sale è indovinando la password. Cioè, avranno hash ogni ipotesi e scopriranno se ha hash alla stessa password quando viene aggiunto il sale.
L'utilizzo di password_hash
in PHP senza il parametro $algo
utilizzerà sempre l'algoritmo più sicuro al momento. Un algoritmo di hash sicuro è lento in modo che se un utente malintenzionato riesce a ottenere gli hash e il sale che devono attendere a lungo per eseguire le proprie ipotesi di password. Quindi un vero utente che accede deve attendere 1 *
dell'algoritmo lento, diciamo un secondo. Un utente malintenzionato che prova 10 milioni di tentativi di password dovrebbe attendere 10.000.000 di secondi. Dovresti presumere che abbiano un hardware migliore di te, quindi in realtà queste matematiche non reggono - il punto è che un algoritmo lento rallenterà sufficientemente il loro attacco. L'attuale algoritmo password_hash
, che è bcrypt, si è dimostrato lento senza alcuna scorciatoia disponibile al fine di scoprire se una determinata password indica l'hash della password.