La elaboración de las funciones sirve a ambos:
Hashing es, como dijiste, no reversible. También es constante. Por eso lo usamos para almacenar contraseñas. Cuando establece su contraseña para, digamos, su correo electrónico, el servidor nunca la almacena (bueno, algunos lo hacen, pero merecen un cierto grado de vergüenza pública). En cambio, (asumiendo que su contraseña es "contraseña") almacenan h ("contraseña") . Ahora digamos que desea iniciar sesión. Aquí es donde entra en juego el cifrado . Usted y el servidor van a través de algo llamado intercambio de claves Diffie-Helfman, que le permite intercambiar una clave con el servidor. Ahora usa esa clave para cifrar su contraseña ( x = e ("contraseña") ) y enviarla al servidor. El servidor, ya que tiene la misma clave que usó para cifrar su contraseña, puede realizar la función e ^ -1 (x) . Ahora tiene el texto plano de su contraseña. Si estuviéramos hablando de Heartbleed, este es el punto más probable para que le roben su contraseña. De todos modos, ahora el servidor realiza la función h ("contraseña") y la compara con el hash de contraseña almacenado que tiene asociado con su nombre de usuario. Si el hash que generaron a partir del valor que les envió coincide con el que tienen, le permitirán acceder a su cuenta.