Joven hacker sonriendo

Cifrar contraseñas con salt

Necesidad

Cifrado de contraseñas con salt en ASP.NET.

Contexto

A continuación se describen las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. Se desarrolla una aplicación en ASP.NET.

  2. Se requiere el uso de funciones de resumen (hash) para cifrado de contraseñas.

  3. Se requiere implementar salt al momento de cifrar las contraseñas.

Solución

  1. El proveedor de pertenencia de SQL Server admite los formatos de contraseña Clear, Encrypted y Hashed. Las contraseñas Clear se guardan en texto sin formato, lo cual mejora el rendimiento de almacenamiento y recuperación de contraseñas pero es menos seguro, ya que las contraseñas se leen con facilidad si la base de datos de SQL Server se ve comprometida. Las contraseñas Encrypted se cifran cuando se almacenan y se pueden descifrar para su comparación o recuperación. Esto requiere un procesamiento adicional para el almacenamiento y la recuperación de contraseñas, pero es más seguro ya que las contraseñas no pueden determinarse con facilidad si se ve comprometida la base de datos SQL Server. Las contraseñas Hashed se fragmentan utilizando un algoritmo hash unidireccional y un valor salt que se genera aleatoriamente cuando se almacenan en la base de datos. Cuando se valida una contraseña, se fragmenta con el valor salt en la base de datos para su comprobación. Las contraseñas fragmentadas no se pueden recuperar [1].

  2. El valor de PasswordFormat se especifica en la sección providers del archivo Web.config de la aplicación ASP.NET.

  3. De manera predeterminada, las contraseñas Encrypted se cifran y a las contraseñas Hashed se les aplica un algoritmo hash según la información proporcionada en el elemento machineKey de la configuración [2]. Tenga en cuenta que si se especifica un valor de 3DES para el atributo validation o si no se especifica ningún valor, se aplicará el algoritmo hash SHA1 a las contraseñas correspondientes.

  4. Se puede definir un algoritmo hash personalizado mediante el atributo hashAlgorithmType [3] del elemento de configuración membership , presente en el esquema de configuración de ASP.NET. Si elige el cifrado, el cifrado de contraseña predeterminado utiliza AES. Puede cambiar el algoritmo de cifrado estableciendo el atributo decryption del elemento de configuración machineKey. Si cifra las contraseñas, debe proporcionar un valor explícito para el atributo decryptionKey en el elemento machineKey. No se admite el valor predeterminado de AutoGenerate para el atributo decryptionKey al utilizar las contraseñas cifradas con Pertenencia de ASP.NET [4].

  5. En el siguiente ejemplo, se muestra el elemento membership en la sección system.web del archivo Web.config de una aplicación ASP.NET. A continuación, se especifica la instancia SqlMembershipProvider de la aplicación y se establece el formato de contraseña en Hashed.

Web.config
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="20">
  <providers>
    <add name="SqlProvider"
      type="System.Web.Security.SqlMembershipProvider"
      connectionStringName="SqlServices"
      enablePasswordRetrieval="false"
      enablePasswordReset="true"
      requiresQuestionAndAnswer="true"
      passwordFormat="Hashed"
      applicationName="MyApplication" />
  </providers>
</membership>

Referencias

  1. Storing Hashed Passwords

  2. Password Format

  3. HashAlgorithm Class

  4. RandomNumberGenerator Class

  5. REQ.0132: El sistema debe almacenar las contraseñas con diferentes derivaciones de clave (Salt).

  6. REQ.0133: Las derivaciones de clave (Salt), deben ser aleatorias y de mínimo 48 bits.

  7. REQ.0142: Las funciones de criptografía del sistema deben ser implementadas con mecanismos criptográficos pre-existentes.

  8. REQ.0145: Debe utilizarse funciones resumen con un tamaño mínimo de 256 bits.




Haz un comentario