Per una semplice chiamata di MD5 o SHA-1, una velocità realistica è compresa tra 1 e 10 miliardi di password al secondo. Questo è ciò che può essere ottenuto con una buona GPU. Inoltre, se l'hashing non è salato, l'attaccante può condividere lo sforzo tra diverse sessioni di attacco, solitamente usando tabelle precalcolate (es. tavoli arcobaleno ): un utente malintenzionato, da qualche parte, ha dovuto eseguire hash gazillions di possibili password una volta , ma le tabelle risultanti possono essere applicate a migliaia di hash con un solo piccolo costo.
Se la funzione di hash è corretta (come descritto in questa risposta ), quindi utilizza un parametro di rallentamento che rende la funzione il più lento possibile. La lentezza influisce sia sul difensore (il server onesto che usa l'hash per autenticare gli utenti) che sull'attaccante. Potremmo immaginare, ad esempio, che il difensore sia pronto a investire 10ms di valore della propria CPU su ogni istanza di hashing, il che significa che il defender può gestire 100 hash delle password al secondo. L'hacker può lanciare più PC sul problema, con più core, e possibilmente utilizzare hardware specializzato (GPU, FPGA ...), che può dargli un po 'di spinta; diciamo che l'attaccante può essere 100 volte più efficiente con l'hashing della password rispetto al difensore, portando a una forza bruta di 10000 tentativi al secondo.
La spinta che l'attaccante può ottenere tramite hardware specializzato dipende dalla funzione (ad esempio una GPU è buona per attaccare PBKD2 / SHA-256, non tanto per attaccare bcrypt). Quanto hardware l'attaccante sarà in grado di lanciare al problema dipende anche da parametri esterni (il suo budget, la sua motivazione ...). La lentezza usata dal difensore è un compromesso, perché una maggiore lentezza usa le risorse del server e può renderlo più vulnerabile a negazione -of-service attacchi .