È possibile ottenere il sale se ho l'hash e la password originale?
Il mio istinto è no, ma sarebbe impossibile o ci vorrà solo molto tempo?
Ottenere sale da hash(salt+password)
sarebbe tanto difficile quanto ottenere password da hash(salt+password)
.
Non sono proprio sicuro del perché vorresti trovare il sale, poiché generalmente il sale non è considerato segreto. Fondamentalmente nel tuo caso il sale è essenzialmente la password in quanto non sai di cosa si tratta e la password è salata (prendiamo da parte la semantica che detta la password probabilmente non sarà globalmente unica) in quanto non è segreta.
Lo standard PBKDF2 afferma che devono essere utilizzati almeno 64 bit. Tuttavia Thomas Pornin afferma che:
Salts must be unique; that's their one and only job. You should strive, as much as possible, to never reuse a salt value; the occasional reuse is rarely critical but should still be avoided). With reasonably designed password schemes, there is no other useful property in salts besides uniqueness; you can choose them however you want as long as you do not reproduce the exact same sequence of bits. Uniqueness must be understood worldwide.
A common way to have more-or-less unique salt values is to generate them randomly, with a good generator (say, one which is fit for cryptographic usages, like /dev/urandom). If the salt is long enough, risks of collisions (i.e. reusing a salt value) are low. If you use n-bit salts, chances of a collision become non-negligible once you reach about 2n/2 generated values. There are about 7 billions people on this planet, and it seems safe to assume that they, on average, own less than 1000 passwords each, so the worldwide number of hashed passwords must be somewhat lower than 242.7. Therefore, 86 bits of salt ought to be enough. Since we kind of like so-called "security margins", and, moreover, since programmers just love powers of two, let's go to 128 bits. As per the analysis above, that's more than enough to ensure worldwide uniqueness with high enough probability, and there is nothing more we want from a salt than uniqueness.
Si noti che dipenderà anche dall'algoritmo di hashing della password, attualmente esistono tre algoritmi di hashing delle password accettati che sono considerati sicuri:
Questi sono algoritmi piuttosto lenti, rendendo meno fattibile la forza bruta del sale. Ora se il tuo sale è 64 bit e il tuo algoritmo è lento, non è affatto fattibile. Diciamo che hai un sale a 64 bit:
((2 64 ) * t) / 2
Dove t è il tempo necessario per calcolare un singolo hash e diviso per due in quanto statisticamente lo troverai probabilmente dopo aver fatto metà degli hash. Indipendentemente dal dire che è MOLTO di tempo.
Quindi dipenderà in gran parte dalla lunghezza del sale e l'algoritmo usato quanto è fattibile per forzare la salda su un sale se non lo conosci.
Supponendo di conoscere la funzione hash e il metodo utilizzato per generare l'hash dalla password e salt è possibile scoprire il sale se si dispone della password originale e dell'hash di fine. Userebbe la forza bruta - non c'è un modo intelligente o veloce per farlo.
Nel tuo scenario tipico il tuo hash è generato da 1) hashing della password quindi 2) combinandolo con il salt, e poi 3) hashing la combinazione di hash della password e salt. Se conosci 1) e 3) e conosci la lunghezza del sale puoi provare ogni combinazione del sale mancante fino a quando non la trovi. Ciò richiederebbe molto tempo e potenza di calcolo.
Non riesco a pensare a uno scenario in cui vale la pena scoprire il sale. Si suppone che i sali siano solo una volta e che non sia necessario proteggerli. Ci sono molti scenari in cui il sale viene inviato su canali non criptati, quindi è probabile che non sia necessario scoprirlo comunque, se è possibile ottenere l'hash finale probabilmente hai già il sale. Anche se qualcuno implementasse un sistema crittografico che usasse un sale statico (una cattiva idea!) Non dovresti forzarlo come probabilmente puoi ottenerlo con altri mezzi.
Leggi altre domande sui tag passwords