Encriptación de contraseña

Estoy creando una pantalla de inicio de session para una aplicación en C #. En mi pantalla de inicio de session, estoy leyendo el nombre de usuario y la contraseña de la database y comprobando si el nombre de usuario y la contraseña introducidos son correctos o no. Necesito la contraseña para encriptar mientras estoy leyendo la contraseña de la database. ¿Alguien puede explicar cómo funciona el encryption y desencryption?

  1. Si tengo que almacenar el valor encriptado en la database para leerlo.
  2. En este momento tengo dos campos

    column names: username password values: admin password 
  3. ¿Debo save el valor encriptado de la contraseña en otro campo en la tabla de inicio de session?

Primero: el enfoque común ahora es almacenar el hash salado de la contraseña, en lugar de la contraseña de text sin formatting (SHA-1 y mejor algorithm hash son preferidos, evite MD5 porque ya no es seguro). Cuando el usuario inicia session, recalcula el hash de la cadena de input y luego lo compara con la cadena almacenada en la database.

EDIT: ¿por qué no deberías usar el encryption para la contraseña? Porque cuando el atacante conoce la key del encryption, todas las passwords estarán expuestas (Eso es muy malo). Si usa hash, solo puede adivinar uno por uno (y esto no es fácil). De lo contrario, los algorithms de hash, en general, son más rápidos que el encryption, usted tomará el beneficio de performance.

EDIT: ¿por qué deberías almacenar hash salado, en lugar de hash? Debido a que los algorithms hash están garantizados, si hash cadenas idénticas, el resultado es el mismo. Esto puede conducir a un problema: cuando el atacante ve los mismos valores hash, puede adivinar que los texts son los mismos, y esto le brinda la oportunidad de get la contraseña original.

Sal significa que además del text original, colocas text aleatorio y, por lo tanto, dos cadenas idénticas generarán diferentes valores de hash

Eche un vistazo a esto: http://www.obviex.com/samples/hash.aspx

En caso de que el usuario olvide su contraseña, puede usar la function de restablecer contraseña, que muchos sitios están usando:

  1. El usuario solicita un restablecimiento de contraseña
  2. Un correo electrónico que contiene un enlace especial (incluye un token / PIN secreto) se enviará a la dirección de correo electrónico registrada, que permite al usuario restablecer su contraseña.
  3. Una contraseña creada random se enviará nuevamente al usuario, luego podrá iniciar session y cambiar su contraseña.

ACTUALIZACIÓN 14 de mayo de 2012: la respuesta parece ser antigua y no completamente cierta. Las personas se están moviendo a un algorithm hash-encryption más seguro para almacenar la contraseña. Una de las soluciones notables ahora es bcrypt, y otra (nueva y prometedora) es scrypt.

La ventaja de estas encriptaciones? ¡Son lentos! Mucho más lento que el algorithm hash. Con el poder de GPU (por ejemplo, CUDA de nVidia), no es imposible descifrar el valor hash ahora, y la lentitud puede hacer que sea mucho más difícil descifrar este encryption.

Puede encontrar más acerca de bcrypt en: http://codahale.com/how-to-safely-store-a-password/

Segundo: debe separar la tabla de usuarios (contiene perfiles de usuario, como el nombre completo, DoB, dirección, …) y la tabla de inicios de session (que contiene nombre de usuario y contraseña, y algunos attributes especiales). Esto conducirá a una mejor gestión y networkingucirá el riesgo de exponer información sensible

Junto con los consejos dados, existen otros methods para proteger las passwords:

  1. Contraseña de una sola vez: a pesar de implementar el hash salado, las passwords se almacenan en el disco duro y son propensas a quebrarse. Entonces, se requiere un mejor enfoque aquí. A diferencia de las passwords estáticas, las passwords únicas se cambian cada vez que un usuario inicia session en el sistema y, por lo general, los usuarios deben llevar un pequeño hardware utilizado para sincronizar con el server. Principalmente hay dos types de OTP: (Visite Autenticación más segura con una contraseña de única vez )

    • Sincronizado por time
    • Sincronizado con contador
  2. Usando BCrypt que usa una variante del progtwig de encryption Blowfish y contiene un factor de trabajo, que le permite determinar qué tan costosa será la function hash. Para familiarizarse con bCrypt, visite: http://codahale.com/how-to-safely-store-a-password/

En C #, puede usar la biblioteca BCrypt.Net, que es un puerto de la biblioteca de iBCrypt: lea el siguiente artículo para comprender cómo hacer que esta biblioteca se ejecute en Visual Studio.Net:

Uso de BCrypt en una aplicación .NET: por qué es mejor que SHA o MD5.

Por supuesto, hay muchas discusiones sobre este algorithm en SO, búsqueda y estudio más sobre esto.

¿Está implementando su propio mecanismo de authentication? Puede usar la authentication de Microsoft System.Web.Security ya existente. Al utilizar la class Membership, puede validar la contraseña del usuario sin recuperarla de la database. De esta forma, podrá almacenar la contraseña salada (encriptada) en su database. Simplemente use Membership.CreateUser y Membership.ValidateUser. Si no es necesario (performance o implementación propia), utilice las implementaciones existentes y ahorre time.

La contraseña debe almacenarse en la database con el valor encriptado. Y cuando el usuario intente iniciar session, cifre la contraseña con el mismo algorithm y luego compárela con el valor en db.

Md5 se usa generalmente para el encryption de passwords, ya que no se puede descifrar. En caso de que el usuario olvide la contraseña, no podrá recuperarla, pero solo se puede restablecer.

Espero que esto ayude !

Puedes encriptar las passwords de muchas maneras.

Una de las forms es usar el encryption MD5. Déjame mostrarte uno de los methods de encriptación que estoy usando.

 #region Encrypt public string Encrypt(string simpletext, string keys) { try { XCryptEngine xe = new XCryptEngine(); xe.Algorithm = XCrypt.XCryptEngine.AlgorithmType.DES; //DES = Data Encryption Standard string cipher = xe.Encrypt(simpletext, keys); if (cipher != null) return (cipher); else return null; } catch (Exception ex) { throw ex; } } #endregion #region Decrypt public string Decrypt(string simpletext, string keys) { try { XCryptEngine xe = new XCryptEngine(); xe.Algorithm = XCrypt.XCryptEngine.AlgorithmType.DES; //Console.WriteLine(xe.Decrypt(simpletext, keys)); simpletext = simpletext.Replace(" ", "+"); string cipertext = xe.Decrypt(simpletext, keys); if (cipertext != null) return (cipertext); else return null; } catch (Exception ex) { throw ex; } } #endregion 

necesita usar reference para XCrypt para usar esto.

 using XCrypt;