password encrypt c# sql-server encryption passwords hash

encrypt password c#



C#y SQL Server: contraseñas. Donde hacer que? (4)

Ok, tengo una aplicación escrita en C #. Tenemos datos en un Servidor SQL. Entre esos datos tenemos cuentas de usuario, que darán acceso a la aplicación.

He leído todo, y sé que debes sal y hash y posiblemente hash un montón de veces, etc. Pero, ¿dónde hago qué? ¿Qué envío desde y hacia SQL Server? ¿Qué almacena exactamente en la base de datos? ¿Lo tengo hash en SQL? (posiblemente una función hash allí, como en mysql?) ¿Hizo hash y hago las cosas elegantes en mi código? ¿Envío el hash al servidor y lo comparo, o obtengo el hash del servidor y lo comparo en mi aplicación? ¿Qué hay de la sal? ¿Dónde lo hago? ¿Dónde lo guardo? ¿Como lo consigo?

En otras palabras, ¿podría alguien darme un recorrido claro y agradable de un escenario de inicio de sesión (y posiblemente un escenario de agregar / restablecer contraseña de usuario)? Qué va donde, qué se debe usar, dónde, etc.

Espero que alguien pueda aclararme estas cosas =)


Estoy de acuerdo con Joel Coehoorn por completo, la mejor opción es confiar en la implementación probada y verdadera de otra persona. Sin embargo, si está decidido a implementar su propia implementación de seguridad, mi consejo es el siguiente:

  1. Almacene el hash y la sal en la base de datos.
  2. Genera el hash y la sal en tu propio código. De esta forma, no te vincularás a una base de datos específica.
  3. Nunca envíe la contraseña a través del cable como texto sin formato. Recomendaría buscar el hash y la sal de la base de datos y compararla con las calculadas a partir del nombre de usuario y la contraseña proporcionados por la parte que desea autenticarse.

Lo hice hace algunos años antes de que el modelo de proveedor de membresía estuviera disponible.

Usamos las funciones incorporadas en ASP.NET para manejar el hash de la contraseña; es el método estático HashPasswordForStoringInConfigFile en el espacio de nombres FormsAuthentication. Le da una contraseña y una opción de cifrado y devuelve la contraseña hash.

Nuestro flujo fue: - Obtener la contraseña hash de la base de datos para el nombre de usuario ingresado. - Hash la contraseña ingresada. - ¿Se complementan? Si es así, continúe, de lo contrario, el inicio de sesión fallará.

Al cambiar la contraseña, enviamos el hash a la base de datos para almacenar; no enviamos la contraseña no encriptada.

Y, creo, es lo que está haciendo MembershipProvider hoy.

Para reiterarlo también, la pieza más importante al realizar la autenticación de formularios independientemente de cómo lo haga, es trabajar sobre una conexión segura (HTTPS).


Para C # + SQL Server, puede usar el modelo MembershipProvider, que se encargará de todo esto por usted.

E IMO, la parte más importante de todo esto es no hacerlo tú mismo . Por el contrario, confíe en el mecanismo proporcionado por su plataforma. Es tan fácil equivocarse de una manera sutil que parece funcionar. Luego se despliega, y usted ni siquiera sabe que algo anda mal hasta que lo piratean.


Si está utilizando ASP.NET, usar las cosas integradas para la membresía es una tarea fácil de implementar. Recomendaría ir de esa manera.

Sin embargo, como una pregunta general, implementaría el hashing en su código local, luego solo enviaría los valores de hash a la base de datos. Para sales hay varias formas de hacerlo, puede crear un sal aleatorio o puede saltear el valor usando la id de registros u otra cosa. De nuevo, lo haría en el código C #. Hay un método útil en el marco para hacerlo.