SHA256 anziché Rfc2898DeriveBytes [chiuso]

3

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

    
posta Maxim 08.09.2016 - 07:24
fonte

2 risposte

3

Utilizza l'algoritmo noto e affidabile su uno che hai creato tu stesso. **

Non posso parlare per l'entropia, ma ovviamente ci vorrà più tempo se hai un numero sufficientemente grande di iterazioni. È solo questione di trovare quel numero. Detto questo, personalmente non userò il tuo codice basato su SHA256.

Come è stato detto in quella che probabilmente è la mia risposta preferita su security.SE : La complessità è male. Fatto in casa è cattivo. New is bad. Dalla stessa risposta, Rfc2898DeriveBytes è PBKDF2 e PBKDF2:

  • È stato specificato per un lungo periodo di tempo, per ora non sembra danneggiato.
  • È già implementato in vari framework (ad esempio è fornito con .NET).
  • Altamente configurabile (sebbene alcune implementazioni non ti permettano di scegliere la funzione di hash, ad esempio quella in .NET è solo per SHA-1).
  • Ricevute benedizioni NIST (modulo la differenza tra hashing e derivazione chiave, vedi più avanti).

Perché vorresti scrivere il tuo codice di crittografia potenzialmente difettoso, potenzialmente vulnerabile, sicuramente non necessario quando c'è già un codice scritto per te che è stato testato, attaccato e dimostrato di essere buono?

Ulteriori letture:

risposta data 08.09.2016 - 12:38
fonte
1

Sembra che tu voglia SHA256 perché è più sicuro di SHA1, ma vuoi anche PBKDF2 perché è più sicuro di un singolo hash. Soluzione: usa PBKDF2 con SHA256 .

    
risposta data 08.09.2016 - 08:40
fonte

Leggi altre domande sui tag