BCrypt je populární algoritmus pro hashování hesel. Mezi jeho výhody patří kvalitní dokumentace, standardizovaný, stejný napříč platformami a jazyky (třeba PHP).
Velmi kvalitní implementace pro Delphi je github.com/JackTrapper/bcrypt-for-delphi.
Co myslím kvalitní implementací? Jeden soubor, self testy, bez externích závislostí, dobře dokumentovaný a udržovaný.
Jak vytvoříme hash hesla?
hash := TBCrypt.HashPassword('MrakoplašMáVelkýKlobouk', 14); //specifikován cost factor 14
Cost faktor je náročnost pro odhalení hashe. Pokud parametr vynecháme, je doplněn výchozí pro aktuální dobu (v čase se pomalu zvyšuje jak se zlepšuje výkon počítačů).
Jak heslo validujeme?
uses
BCrypt;
var
bRehash: boolean;
begin
Result := TBCrypt.CheckPassword(sPwd, sHash, bRehash);
Kde bRehash je vrácen když je třeba heslo aktualizovat (např. cost faktor - časová náročnost - přestala vyhovovat).
Dle konvence je hash ve formátu
$2a$10$6kLz4E/xi3awoSBUc.ERPO7YJZ8ZDc9UwEkiTskiaU/i.BUmbh8pu
Kde $2a je verze, $10 je cost faktor, 22 base64 encoded znaků sůl a zbytek.
Zajímavé povídání o historii a verzích je dostupné přímo ve zdrojáku nebo na wikipedii.
Pokud je tu nějaký odborník na šifrování (a já vím, že jsou), klidně mne doplňte prosím.