Tak nevím, jestli jsi to pochopil dobře. Např. rozhodně nemá smysl hašovat sůl zvlášť, myslím, že směšuješ sůl (sloužící k rozrůznění v db uložených haší stejných hesel a prevenci slovníkového útoku) a výzvu (sloužící k tomu, aby nešlo odchytit pomocí MIM heslo a později znovu použít).
1) Princip VÝZVY je ten, že klient zahašuje heslo s něčím, co mu pošle server (to něco může být pokaždé jiné).
Server provede stejnou hash a porovná.
2) Pokud není záhodno, aby server znal heslo uživatele, tak může server znát pouze hash uživatele. Pak je postup stejný, akorát klient před algoritmem 1) heslo zahašuje. Pak server potřebuje znát pouze hash toho hesla.
3) Pokud není záhodno, aby šla hesla na serveru prolomit pomocí slovníku, je třeba hesla hašovat se solí. Tuto sůl buď klient zná (pak je postup stejný jako v 2, akorát se při hašování přidá sůl), nebo nezná (např. proto, že je pro každého uživatele jiná, což je bezpečnější). V tom případě musí klient o sůl požádat server. Komunikace je tedy takováto
K: Ahoj, tady uzivatel UZIVATEL, chci se prihlásit
S: Ok, sůl uzivatele UZIVATEL je SUL, náhodná vyzva je VYZVA
K: Ok, autentizuji se pomoci hash(VYZVA+hash(SUL+HESLO))
S: Zkontroluje hash(VYZVA + HASHOVANE_OSOLENE_HESLO)
To, že komunikace probíhá v jedné session, tzn. server musí vědět, že přihlašovanému poslal tu a tu výzvu a on se chce přihlásit jako ten a ten uživatel je doufám jasné.
All clear?
PS: ?ožnost, jak zjednodušit solení a zachovat unikátní sůl je nastavit sůl jako USERNAME+nějakáblbostprovšechnystejná.