Affinché il client e il server si dimostrino reciprocamente che hanno la stessa chiave condivisa premaster, l' autore originale suggerisce questo:
M = H(A | B | K) -->
<-- H(A | M | K)
Il RFC 2945 consiglia questo:
M = H(H(N) XOR H(g) | H(U) | s | A | B | K) -->
<-- H(A | M | K)
Quanti di questi concatenamenti aumentano effettivamente la sicurezza? Inoltre, quanta libertà devo modificare senza ridurre la sicurezza? Immagino che sarebbe altrettanto sicuro sostituire uno XOR con la concatenazione, per esempio.
- A - pubblico, casuale ogni volta, determinato dal client
- B - pubblico, casuale ogni volta, determinato dal server
- U - privato nella mia implementazione, nome utente (hash salato e salt sono pubblici)
- s - pubblico, associato alla password dell'account utente, determinata dal server
- N e g - public, costanti, determinati dal programmatore
- K - privato, casuale ogni volta, chiave segreta tra il server e il client
Quale definizione dovrei usare? La differenza tra i due è che più valori pubblici determinati dal server sono concatenati nel secondo hash. Ne vale davvero la pena, dal momento che qualsiasi hacker conosce H(N) XOR H(g) | H(U) | s | A | B
proprio come A | B
?
EDIT: U in maiuscolo è in realtà il nome utente. Lo stavo leggendo in minuscolo. Ovviamente non grande sulla sensibilità alle maiuscole del C #.