SHA256 en lugar de Rfc2898DeriveBytes [cerrado]

3

¿Es suficiente usar este método con SHA256 o es mejor usar Rfc2898DeriveBytes (que originalmente utiliza SHA1)?

    public static byte[] ComputeHash(byte[] data, byte[] salt, int iterations)
    {
        if (data == null)
            throw new ArgumentNullException(nameof(data));

        if (salt == null)
            throw new ArgumentNullException(nameof(salt));

        if (iterations <= 0)
            throw new ArgumentOutOfRangeException(nameof(iterations));

        using (SHA256CryptoServiceProvider provider = new SHA256CryptoServiceProvider())
        {
            byte[] output = provider.ComputeHash(data.Concat(salt).ToArray());

            for (int iteration = 1; iteration < iterations; iteration++)
            {
                output = provider.ComputeHash(output.Concat(data).Concat(salt).ToArray());
            }
            return output;
        }
    }

¿Se puede usar el código anterior en lugar de Rfc2898DeriveBytes desde el punto de vista de la seguridad? ¿Los hashes tendrán más o menos entropía? ¿Tendrá más o menos complejidad (tiempo de CPU / GPU / ASIC) si usaré el parámetro iteraciones significativamente grande?

    
pregunta Maxim 08.09.2016 - 07:24
fuente

2 respuestas

3

Use el algoritmo conocido y confiable sobre uno que usted mismo haya creado. **

No puedo hablar por la entropía, pero, por supuesto, tomará más tiempo si tiene un número suficientemente grande de iteraciones. Es solo cuestión de encontrar ese número. Dicho esto, yo personalmente no usaría su código basado en SHA256.

Como se ha dicho en lo que probablemente sea mi respuesta favorita en security.SE : La complejidad es malo. Hecho en casa es malo. Lo nuevo es malo. De esa misma respuesta, Rfc2898DeriveBytes es PBKDF2, y PBKDF2:

  • Se ha especificado durante mucho tiempo, parece que no se ha hecho daño por el momento.
  • Ya está implementado en varios marcos (por ejemplo, se proporciona con .NET).
  • Altamente configurable (aunque algunas implementaciones no te permiten elegir la función hash, por ejemplo, la que está en .NET es solo para SHA-1).
  • Recibió bendiciones de NIST (módulo la diferencia entre hashing y derivación clave; vea más adelante).

¿Por qué querría escribir su propio código criptográfico, ya sea potencialmente defectuoso, potencialmente vulnerable, definitivamente innecesario, cuando ya hay un código escrito para usted que ha sido probado, atacado y demostrado ser bueno?

Lectura adicional:

respondido por el Richard Ward 08.09.2016 - 12:38
fuente
1

Parece que desea SHA256 porque es más seguro que SHA1, pero también desea PBKDF2 porque es más seguro que un solo hash. Solución: use PBKDF2 with SHA256 .

    
respondido por el Sjoerd 08.09.2016 - 08:40
fuente

Lea otras preguntas en las etiquetas