SHA-2 in questo caso particolare è sicuro quanto PBKDF / scrypt / bcrypt. Le iterazioni sono inutili e dispendiose. Genera password ad alta entropia (256 bit) e dimentica KDF e persino sali.
In effetti, ha più senso usare SHA-2 rispetto a PBKDF perché non esiste un'implementazione della piattaforma esistente di l'algoritmo e "lanciare la tua crittografia" è un no-no.
Questa è un'affermazione abbastanza forte. L'essenza qui nella domanda è che l'OP ha il pieno controllo delle password che memorizza nel sistema e sa che sarà l'unico a memorizzare le password nel sistema.
Signal utilizza una costruzione chiamata HKDF nel suo algoritmo a doppio cricchetto, che essenzialmente applica l'algoritmo di hashing per una sola iterazione.
Perché va bene?
Le password KDF esistono precisamente per una ragione: le password a bassa entropia. La maggior parte delle persone non ricorderà una chiave a 128 o 256 bit generata da un CSRNG nelle loro teste. Oserei che la maggior parte delle persone possa ricordare al massimo una stringa casuale a 40 bit per un periodo di tempo abbastanza lungo da poterla utilizzare.
Praticamente tutte le funzioni hash (anche MD4, MD5 e SHA-1 , ma dal momento che hai detto di avere SHA-2 sulla piattaforma, siamo al sicuro qui) hai una funzione chiamata resistenza alla preimmaginazione, che è abbastanza buona per la tua applicazione poiché controlli tutte le password che vengono memorizzate sul tuo sistema. Ciò significa che è computazionalmente impossibile, dato un hash, generare qualcosa che abbia lo stesso hash.
Semplificando un po ', il modo più pratico per generare un'immagine preliminare per una di queste funzioni hash è mantenere provando input. Ci sono alcuni esempi di attacchi che funzionano leggermente meglio della forza bruta, ma sono totalmente irrealizzabili. Ora, se la password / chiave che hai scelto di inserire nella funzione hash ha solo 16 bit di entropia, questa proprietà di resistenza non ti farà molto, perché l'attaccante sarà in grado di provare tutti i 65536 input diversi che avresti potuto inserire.
Perché il controllo della password è importante
Pensa meno alle cose che stai inserendo come "password" ma più come chiavi crittografiche. Finché stai eseguendo l'hashing delle chiavi che hanno un'entropia maggiore o uguale al numero di bit in uscita dalla tua scelta della funzione hash (per SHA-256, sono 256 bit), allora stai perfettamente bene solo eseguendo un'iterazione dell'hash sopra per impedire l'estrazione della chiave. La resistenza all'immagine precedente dell'hash combinata con l'elevata entropia della tua chiave significa che un attaccante semplicemente non può indovinare il valore che hai inserito. Non c'è bisogno di migliaia di iterazioni o litigare con il lato commerciale o ragionare su un attacco astratto per non - capi così ricettivi. La resistenza FPGA / ASIC è un punto controverso quando devi indovinare un input a 256 bit nella funzione hash.
Raccomandazioni
Genera le tue "password" con un RNG hardware o un CSPRNG e distruggere prontamente qualsiasi materiale seed che potrebbe essere utilizzato per ripristinare qualsiasi stato interno e quindi le password. Assicurati che siano lunghi 256 bit. Se il tuo sistema non supporta password non alfanumeriche o non ASCII, dopo generi i 256 bit, codificali in base-64 o base-26 o binari, se preferisci. (Ciò significa che le password effettive che invii saranno più lunghe di 32 byte, ma questo non aiuta molto l'entropia.)
Tratta queste password come chiavi crittografiche - idealmente, sarebbero memorizzate sull'hardware gettoni. Un gestore di password hardware funziona molto bene per questo scopo. Memorizza gli hash SHA-256 nel tuo sistema e verifica le password tramite l'hashing e il confronto. Dovresti rifiutare tutte le password tentate che non corrispondono al tuo criterio di generazione (un esempio potrebbe essere una password selezionata dall'utente < 256 bit), anche se gli hash corrispondono, e non dovresti permettere a nessuno di impostare una password che non proviene da CSRNG. Questo dovrebbe essere
documentato. Ancora meglio è se aggiungi qualche byte di checksum oscuro alla fine delle password che generi che viene verificato dalla piattaforma prima che ti permetta di impostare la password. Questo dovrebbe dissuadere tutti, tranne le persone più esilarantemente incompetenti, dal mettere qualcosa di meno di una chiave crittografica sulla tua piattaforma.
Crittografia a chiave pubblica
Il tuo caso d'uso è un po 'strano. La maggior parte dei luoghi mantiene le password perché impostare una PKI e trattare con gli utenti finali è molto difficile, specialmente con cose come le chiavi pubbliche. Dato che sembri essere l'unico a inserire le password nel sistema, forse avrebbe più senso memorizzare le chiavi pubbliche Ed25519 o ECDSA sul sistema e scrivere lì il codice che implementa un protocollo di risposta alla sfida (uno semplice è firmare questo 256- valore in bit, ma fai attenzione a non riutilizzare queste chiavi, poiché qualcuno potrebbe indurti a firmare il tuo Bitcoin o una confessione criminale). Il dispositivo che si interfaccia con il tuo sistema qui e manterrebbe le chiavi private probabilmente ha una forte implementazione della crittografia a chiave pubblica e non avrebbe problemi ad autenticarsi. La tua implementazione "roll my own" della verifica della firma potrebbe essere la meno sicura al mondo in termini di attacchi side-channel (pensa di mettere il suo intero stato su un cartellone pubblicitario o sulla blockchain), purché fornisca la risposta corretta, e staresti perfettamente bene, poiché l'algoritmo di verifica semplicemente non ha accesso alle chiavi private.