Scelta automatica della funzione di hash per la derivazione della chiave

2

Questa è una domanda teorica: ha senso ed è sicuro?

Il mio obiettivo è rafforzare la passphrase. Il flusso è il seguente:

  1. Inserisco una pssphrase admin1234 . Questa passphrase verrà utilizzata per ricavare una chiave per la crittografia / decrittografia simmetrica.
  2. Una passphrase entra nella classe sottostante. Viene fuori la quantità desiderata di byte.

L'implementazione PBKDF2 a cui mi riferisco è fornita all'interno dello spazio dei nomi 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;
    }
}

Ciò di cui sono preoccupato è la scelta della funzione di hash. Le mie domande:

  • Ha senso scegliere la funzione di hash in base alla quantità desiderata di byte derivati?
  • In caso contrario, ha senso scegliere la funzione di hash basata su qualche altro parametro per renderlo automatico?

Sento che la risposta è no per entrambi, ma una parte di me vuole vedere un senso al suo interno. Come scegliere la funzione di hash altrimenti?

    
posta Randolph 15.04.2018 - 07:49
fonte

1 risposta

3

Does it make sense to choose the hash function based on the desired amount of derived bytes?

PBKDF2 può produrre tanti byte quanti ne viene richiesto, indipendentemente dalla dimensione dell'hash. PBKDF2 produrrà felicemente tanti byte quanti ne occorrono, ma sarà significativamente più lento, poiché deve passare attraverso un secondo passaggio. Un utente malintenzionato può facilmente ottimizzare questo lavoro extra, rendendo poco probabile l'utilizzo di PBKDF2 per generare un output più ampio rispetto a quanto previsto dalla funzione hash. Se invece usi un hash più grande dell'output desiderato, puoi semplicemente troncare il risultato.

If not, does it make sense to choose the hash function based on some other parameter to make it automatic?

Dovresti scegliere una funzione di hash basata sulla sua sicurezza. Dovresti utilizzare solo un hash crittograficamente sicuro come SHA-256 o BLAKE2. Non è necessario passare in modo dinamico tra le diverse funzioni hash se quella scelta è sufficiente per il lavoro. Alcuni esempi di funzioni hash moderne e crittograficamente sicure che puoi tranquillamente utilizzare con PBKDF2:

  • SHA-2 (come SHA-256 o SHA-512). Questa famiglia di hash è lo standard NIST. SHA-256 è ottimizzato per le operazioni a 32 bit, mentre SHA-512 è ottimizzato per le operazioni a 64 bit. È disponibile in una varietà di formati di uscita e utilizza da 64 a 80 colpi. Non puoi sbagliare con SHA-2.

  • SHA-3 . Una funzione hash più recente standardizzata dal NIST. Nonostante il nome, il design non è affatto correlato a SHA-2. SHA-3 non è ancora in uso comune, ma è generalmente considerato solido.

  • Whirlpool . Questa funzione di hash utilizza internamente un codice a blocchi basato su Rijndael (AES). Ha un digest a 512 bit e utilizza 10 round. Vanta un margine di sicurezza elevato.

  • BLAKE2 . Un hash piuttosto nuovo basato sul codice ChaCha di Daniel Bernstein. BLAKE2b ha un digest a 512 bit e utilizza 12 round. BLAKE2s ha un digest a 256 bit e utilizza 10 round.

La mia raccomandazione sarebbe quella di utilizzare PBKDF2-HMAC-SHA512 con un'uscita a 512 bit. È improbabile che tu abbia bisogno di qualcosa di più grande, e se hai bisogno di un output più piccolo, puoi tranquillamente troncarlo per ottenere la lunghezza desiderata. Ad esempio, se hai bisogno di un output a 160 bit, puoi troncare i 512 bit a 160.

    
risposta data 15.04.2018 - 08:08
fonte

Leggi altre domande sui tag