Sarà più difficile eseguire il brute-fore di un hash senza conoscere la funzione di hash utilizzata - dovrai indovinare sia la funzione hash che i dati all'hash. Tuttavia, non c'è motivo di mantenere segreta la funzione di hash.
In primo luogo, di solito è abbastanza evidente dalla lunghezza dell'hash (o dall'impostazione di un account fittizio e dal provare molte possibilità ovvie) quale algoritmo è stato usato per generarlo. In genere è una cattiva idea modificare le funzioni hash esistenti per "rollare la propria" funzione di hash, poiché (1) non è necessario, (2) sarà un incubo da mantenere su vari sistemi, (3) se fatto male può indebolire drasticamente la sicurezza e (4) come viene calcolata la funzione di hash nel codice sorgente / eseguibile e un determinato utente malintenzionato che compromette l'elenco degli hash, potrebbe anche essere in grado di mettere le mani sul codice sorgente / eseguibile ed essere in grado di decodificare la funzione di hash da lì.
Se vuoi davvero seguire il percorso che l'hash non deve essere forzato con forza bruta (fino a compromettere il codice sorgente dell'applicazione o l'eseguibile), non dovresti usare un hash ma dovresti usare un MAC (Message Authentication Code) . Puoi costruire un MAC con una funzione hash usando la costruzione HMAC : HMAC(password) = H(K1 ++ H(K2 ++ password))
dove H
è una funzione di hash, K
è una chiave segreta (memorizzata nell'applicazione che calcola l'HMAC), K1 = K XOR 0x5c5c...5c
e K2 = K XOR 0x3636...36
sono due chiavi segrete diverse derivate da K (dove 0x5c5c...5c
e 0x3636...36
è un blocco del byte 0x5c
o 0x36
ripetuto con la stessa lunghezza della chiave segreta). Quindi se hai una chiave segreta a 256-bit e usi SHA-256 come funzione di hash, ci sono circa 2 256 potenziali chiavi HMAC (~ 10 77 - per il confronto ci sono stati solo circa 10 26 nanosecondi dal big bang) che un attaccante avrebbe dovuto scorrere prima di trovare la K usata (se in effetti trovano la K corretta e non una collisione improbabile che funzioni per una password specifica ma non altre).
I MAC vengono solitamente usati per verificare l'integrità del messaggio (nel senso che solo qualcuno con la chiave segreta può generare un MAC valido) e non per memorizzare password / autenticare gli utenti, ma non c'è motivo per cui non possano essere utilizzati a questo scopo. Il problema è lo stesso: non vuoi che qualcuno che ha ottenuto un messaggio e l'hash associato (MAC), sia in grado di creare nuovi hash (MAC) per altri messaggi (come parte di un attacco a forza bruta). Si ritiene che i MAC abbiano sicurezza contro questo attacco; mentre la scelta di alcuni schemi complicati casuali come SHA1(SHA512(pw)++SHA256(MD5(pw)++MD4(pw)))
è in linea di principio molto più facile da indovinare per un utente malintenzionato rispetto a una chiave casuale a 256 bit (e più probabile che sia trapelata da una sorta di attacco canale laterale).
L'utilizzo di un MAC è probabilmente eccessivo. Se si utilizzano password complesse e un moderno hash salato rafforzato da chiave (bcrypt, PBKDF, SHA512crypt), la forzatura bruta non è fattibile.