In primo luogo, MD5 ha altri problemi oltre alle veloci velocità di hashing, comprese le vulnerabilità di collisione .
Once computers become faster, then these will be no better than md5.
So I wonder, is it even possible to have a hash function that is
secure, irrespective of the time it takes to execute?
No, una stessa funzione hash potrebbe sempre essere incrinata usando un computer sufficientemente veloce (sufficientemente veloce essendo l'ambiguo proiettile d'argento). Tuttavia, le implementazioni degli algoritmi di hashing possono risolvere questo .
Ad esempio, bcrypt fornisce meccanismi per affrontare l'aumento della velocità di calcolo.
bcrypt utilizza il concetto di round per calcolare gli hash. Ad esempio, bcrypt cancellerà la tua password con un salt e un numero di round:
bcrypt("password","salt",10000)
Note: As pointed out by
darkhogg, the rounds parameter isn't actually submitted to bcrypt. Instead a work factor is sent. The difference being that what is sent is actually a number N which is the exponent used to calculate the rounds. So although 10,000 is used here as an example for the number of rounds, the actual work unit you would need to supply to get 10,000 rounds would be much smaller.
esegue l'hash della combinazione di sale e password per 10.000 volte prima di memorizzare l'hash, il sale e il numero di round. Supponiamo quindi che al momento iniziale dell'implementazione siano necessari 10.000 round di hashing .02 secondi. Un anno dopo l'implementazione iniziale, si nota che 10.000 round richiedono solo 0,1 secondi o metà del tempo. Puoi cambiare i turni a 20.000. La prossima volta che un utente effettua l'accesso, il suo hash verrà calcolato con 10.000 round per l'autenticazione, ma l'hash verrà archiviato con 20.000 round, per l'autenticazione futura.