Come è derivato un sale casuale dall'output di password_hash (), dato che le funzioni di hashing sono deterministiche?

0

Per quanto riguarda la funzione PHP password_verify() , in che modo il sale casuale "unhashed" deriva dall'output di password_hash() , dato che le funzioni di hashing sono deterministiche? Mi sembra che, se il sale originale è in grado di derivare dall'hash finale, il sale è stato usato solo per produrre l'hash finale dopo che la funzione di hashing ha completato il conteggio dell'iterazione. Se questo è il caso, perché usare un sale in primo luogo? Perché non fornire semplicemente un numero di iterazione arbitrario (ma comunque ampio)?

    
posta user1100793 27.03.2018 - 16:19
fonte

2 risposte

4

password_hash e password_verify utilizzano attualmente bcrypt o argon2 che utilizzano entrambi Formato stringa PHC . Il sale è incluso nel formato hash. Non è derivato da password_verify , è letteralmente proprio lì nell'hash che tu gli dai. Questo non è un punto debole perché un sale non deve essere segreto, deve essere universalmente unico.

La tua confusione su come password_verify ottiene il sale sembra essere causata da una terminologia conflittuale. La parola "hash" è spesso usata per riferirsi all'intera stringa di formato PHC (compresi l'identificatore della funzione hash, i parametri, il valore hash effettivo e reale), così come l'output dell'hash reale mediante una funzione di hashing.

Vedi qui per il motivo per cui vengono utilizzati i sali. Se vuoi un segreto che un utente malintenzionato dovrebbe conoscere per le password hash, questo è chiamato pepe .

    
risposta data 27.03.2018 - 16:55
fonte
0

Dai un'occhiata a questa estrema semplificazione di ciò che accade sotto il cofano in PHP:

password_hash(password):
    salt = get_random_salt()
    hash = actual_hashing_function(salt + password)
    return salt + hash
password_verify(password, password_hash):
    salt, actual_hash = split(password_hash)
    compare_hash = actual_hashing_function(salt + password)
    return actual_hash == compare_hash

Come puoi vedere, password_hash non può essere deterministico come parte dell'output - il sale - dipende da una funzione casuale. Tuttavia, actual_hashing_function è deterministico.

La confusione qui deriva da una terminologia piuttosto imprecisa. In un contesto di crittografia, la "funzione di hash" si riferisce probabilmente a qualcosa come actual_hashing_function nell'esempio e un "hash" significa che è in uscita. Tuttavia, in un contesto più applicato come la programmazione, "funzione di hash" potrebbe significare qualcosa come password_hash e un "hash" è un output non deterministico che include il sale.

    
risposta data 27.03.2018 - 17:24
fonte

Leggi altre domande sui tag