Una differenza importante tra la tua costruzione e PBKDF2 è che PBKDF2 usa una funzione pseudo-casuale (prf), tipicamente HMAC, invece di un hash direttamente. SHA1 e SHA2 sono non prfs, quindi alcune prove di sicurezza non si applicano a loro.
Un problema teorico con la tua costruzione è che puoi colpire collisioni interne o catene corte. Siccome il tuo sale e la password rimangono in ogni iterazione, se produci sempre lo stesso hash due volte, allora finirai in un ciclo di hash. (PBKDF2 soffre anche di una variante di questo, ma illustra il tipo di cose da cercare.)
Quindi faresti meglio con il tuo loop che assomiglia a
hash = hmac-sha512(i + salt + password, hash)
ma per tutti i motivi che altri hanno sottolineato, si sta ancora meglio usando PBKDF2, verruche e tutto, invece di far girare il proprio.
Alternative PBKDF2
scryp t è superiore a PBKDF2 per quasi tutte le situazioni. Ma è più difficile imparare a usare correttamente. PBKDF2 è superiore a bcrypt.
Si noti inoltre che PBKDF2 è stato progettato per la derivazione della chiave, non per l'hashing della password. Quindi ha alcune caratteristiche e caratteristiche che non sono proprio ciò di cui hai bisogno. (E ha un bug in quel componente che conta solo per la derivazione della chiave, e solo in circostanze molto insolite).
Per quanto io stia criticando PBKDF2, penso ancora che sia meglio usarlo piuttosto che farlo da solo. I problemi particolari con esso non sono qualcosa che si incontrerà con l'hashing della password.
Un successore di PBKDF2 / scrypt / bcrypt
Potresti voler seguire gli sviluppi del Concorso di hashing delle password . Questo è un tentativo di trovare un successore adatto a PBKDF2, scrypt, bcrypt per l'hashing della password. Ma per il momento, basta usare scrypt se disponibile per te o PBKDF2.