Treba takto:
(salt je samozrejme nekolik nahodnych znaku a slouzi jen k tomu, aby dva uzivatele, kteri maji nahodou stejne heslo nemeli ulozeny stejny hash; pro zjednoduseni se da vynechat)
Spocitam si
hsh = hash(salt+heslo)
a ulozim si (salt, hsh).
Klientovi poslu (challenge, salt)
klient precte od uzivatele heslo_c a posle
resp = hash(challenge + hash(salt+heslo_c))
na serveru si spocitam
check = hash(challenge + hsh)
pokud heslo_c == heslo, pak
hash(salt+heslo_c) == hsh
a tedy
resp == check,
takze prijmeme uzivatele, ktery zada spravne heslo
A naopak:
pokud resp == check, tak bud se heslo_c==heslo, anebo jsme nalezli kolizi
hashovaci funkce, budto v
hash(salt+heslo_c) == hash(salt+heslo), kde heslo != heslo_c,
anebo az po pricteni challenge,
tedy uzivatele, ktery zada nespravne heslo s vysokou pravdepodobnosti odmitneme.