È sufficiente usare questo metodo con SHA256 oppure è meglio usare Rfc2898DeriveBytes (che utilizza originariamente 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;
}
}
È possibile utilizzare sopra il codice anziché Rfc2898DeriveBytes dal punto di vista della sicurezza? Gli hash avranno più o meno entropia? Avrà più o meno complessità (CPU / GPU / tempo ASIC) se userò un parametro iterazioni molto significativo?