Hola, omoreno
Varias consideraciones:
El algoritmo SHA-256 se considera bastante seguro por el momento. Si bien es cierto que ya existen diccionarios inmensos de claves asociadas al hash, sería muy muy difícil acertar en poco tiempo con una de estas claves. Piensa que el algoritmo genera siempre un hash de longitud fija de 64 caracteres (bits) independientemente de la longitud de la cadena encriptada.
En algunos casos, los programadores añaden lo que se llama "salt" a la cadena encriptada, es decir un "condimento" añadido a tu gusto que puede ser cualquier cosa. La ventaja de saber que la cadena encriptada siempre tiene 64 bit de longitud, es que podemos añadir la "salt" en cualquier parte de esa cadena, pero esa "salt" podría o no ser fija, es decir, puede ser una cadena aleatoria generada por nosotros y fijada en el código o prodría ser una cadena generada mediante otro algoritmo, pero basada en algo fijo, como por ejemplo un dato del usuario que no cambie.
De ese modo obtendríamos otra cadena que consiste en el hash original SHA-256 con una cadena en medio, en una posición conocida, que mediante tu propia función vas a generar y luego vas a comparar de forma sencilla.
La cadena encriptada se envía tal cual por internet hacia la base de datos, pero lógicamente siempre es mejor usar una conexión segura SSL.
En resumen, en la parte del cliente (navegador) se genera el hash SHA-256 y se envía al servidor. Allí, el servidor antes de almacenarla en la BD la primera vez, la mezcla con la Salt y entonces la guarda en la BD.
En posteriores consultas, cuando el usuario hace login, se envía el hash de su password y mediante una función ya en el servidor, se vuelve a crear esa cadena cocinada con "salt" y ahí es cuando ya se compara con la que está almacenada en la base de datos.
De esta manera, aunque transmitas en claro el hash desde tu navegador hacia el servidor, y alguien en medio intercepte esa clave encriptada, no podrá usarla para nada, porque realmente es otra cosa lo que hay en la BD.
Dicho eso, hoy en día ya no hace falta pagar por un certificado SSL, porque desde que existe Let's Encrypt yo no he vuelto a hacerlo. Pero eso ya depende del nivel de seguridad exigido para cada caso. De manera que siempre sería necesario o recomendable usar conexiones cifradas en la web.
P.D. Se me olvidó añadir que en caso de pérdida de contraseña por el usuario, siempre hay que generar una nueva, porque el algoritmo SHA-256 es unidireccional. Además por seguridad, se debería exigir que la nueva contraseña no coincida con la anterior, puesto que ésta está almacenada en la BD y se podría comparar antes de almacenar la nueva (cosa que no tiene sentido si el usuario ha olvidado la contraseña, pero eso sí sería aplicable si el usuario sólo desea cambiarla).
Saludos
Por favor, usa el corrector ortográfico antes de pulsar el botón 'Enviar'