¿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?