Para que el cliente y el servidor se demuestren mutuamente que tienen la misma clave compartida anterior al maestro, la autor original sugiere esto:
M = H(A | B | K) -->
<-- H(A | M | K)
El RFC 2945 recomienda esto:
M = H(H(N) XOR H(g) | H(U) | s | A | B | K) -->
<-- H(A | M | K)
¿Cuántas de estas concatenaciones realmente aumentan la seguridad? Además, ¿cuánta libertad tengo para alterarla sin reducir la seguridad? Me imagino que sería igual de seguro si uno reemplaza el XOR con concatenación, por ejemplo.
- A - público, aleatorio cada vez, determinado por el cliente
- B: público, aleatorio cada vez, determinado por el servidor
- U - privado en mi implementación, el nombre de usuario (el hash salado y la sal son públicos)
- s - public, asociado con la contraseña de la cuenta de usuario, determinada por el servidor
- N y g - públicas, constantes, determinadas por el programador
- K: privado, aleatorio cada vez, clave secreta entre el servidor y el cliente
¿Qué definición debo usar? La diferencia entre los dos es que más valores públicos determinados por el servidor se concatenan en el segundo hash. ¿Realmente vale la pena, ya que cualquier atacante conoce H(N) XOR H(g) | H(U) | s | A | B
tan bien como A | B
?
EDITAR: U mayúscula es en realidad el nombre de usuario. Lo estaba leyendo en minúsculas. Obviamente, no es grande en la sensibilidad a mayúsculas y minúsculas de C #.