Selección automática de la función hash para derivación de clave

2

Esta es una pregunta teórica: ¿esto tiene sentido y es seguro?

Mi objetivo es fortalecer la frase de contraseña. El flujo es el siguiente:

  1. Ingresé un pssphrase admin1234 . Esta frase de contraseña se utilizará para obtener una clave para el cifrado / descifrado simétrico.
  2. Una frase de contraseña ingresa a la clase a continuación. Sale la cantidad deseada de bytes.

La implementación de PBKDF2 a la que me refiero se proporciona dentro del espacio de nombres Microsoft.AspNetCore.Cryptography.KeyDerivation .

public static class Pbkdf2
{
    public static byte[] DeriveBytes(string passphrase, byte[] salt, int iterations, int amountOfBytes)
    {
        var prf = DeterminePrfForAmountOfBytes(amountOfBytes);
        return KeyDerivation.Pbkdf2(passphrase, salt, prf, iterations, amountOfBytes);
    }

    private static KeyDerivationPrf DeterminePrfForAmountOfBytes(int amountOfBytes)
    {
        if (amountOfBytes < 1)
            throw new ArgumentOutOfRangeException(nameof(amountOfBytes));

        if (amountOfBytes <= 32)
            return KeyDerivationPrf.HMACSHA256;

        return KeyDerivationPrf.HMACSHA512;
    }
}

Lo que me preocupa es la elección de la función hash. Mis preguntas:

  • ¿Tiene sentido elegir la función hash en función de la cantidad deseada de bytes derivados?
  • Si no, ¿tiene sentido elegir la función hash basada en algún otro parámetro para que sea automática?

Siento que la respuesta es no para ambos, pero una parte de mí quiere ver algo en ella. ¿Cómo elegir la función hash de otra manera?

    
pregunta Randolph 15.04.2018 - 07:49
fuente

1 respuesta

3
  

¿Tiene sentido elegir la función hash en función de la cantidad deseada de bytes derivados?

PBKDF2 puede generar tantos bytes como lo solicite, independientemente del tamaño del hash. PBKDF2 felizmente generará tantos bytes como necesite, pero será significativamente más lento, ya que tiene que pasar por una segunda pasada. Un atacante puede optimizar fácilmente este trabajo extra, lo que hace que sea una mala idea usar PBKDF2 para generar un resultado mayor que el que proporciona la función hash. Si, por otro lado, está utilizando un hash más grande que el resultado deseado, simplemente puede truncar el resultado.

  

Si no, ¿tiene sentido elegir la función hash basada en algún otro parámetro para que sea automática?

Debes elegir una función hash basada en su seguridad. Solo debe usar un hash criptográficamente seguro como SHA-256 o BLAKE2. No es necesario cambiar dinámicamente entre diferentes funciones hash si la que ha elegido es suficiente para el trabajo. Algunos ejemplos de funciones hash modernas y criptográficamente seguras que puede usar de forma segura con PBKDF2:

  • SHA-2 (como SHA-256 o SHA-512). Esta familia de hash es el estándar NIST. SHA-256 está optimizado para operaciones de 32 bits, mientras que SHA-512 está optimizado para operaciones de 64 bits. Viene en una variedad de tamaños de salida y usa de 64 a 80 rondas. No puedes equivocarte con SHA-2.

  • SHA-3 . Una nueva función hash estandarizada por NIST. A pesar del nombre, el diseño no tiene nada que ver con SHA-2. SHA-3 no es de uso común todavía, pero generalmente se considera sólido.

  • Whirlpool . Esta función hash utiliza un cifrado de bloque interno que se basa en Rijndael (AES). Tiene un resumen de 512 bits y utiliza 10 rondas. Cuenta con un alto margen de seguridad.

  • BLAKE2 . Un hash bastante nuevo basado en el cifrado ChaCha de Daniel Bernstein. BLAKE2b tiene un resumen de 512 bits y utiliza 12 rondas. BLAKE2s tiene un resumen de 256 bits y utiliza 10 rondas.

Mi recomendación sería usar PBKDF2-HMAC-SHA512 con una salida de 512 bits. Es poco probable que necesite algo más grande, y si necesita una salida más pequeña, puede truncarlo con seguridad para obtener la longitud deseada. Por ejemplo, si necesita una salida de 160 bits, puede truncar los 512 bits a 160.

    
respondido por el forest 15.04.2018 - 08:08
fuente

Lea otras preguntas en las etiquetas