La prima cosa da notare è che un "hash della password" non è semplicemente un hash della password, è una struttura multi-campo che contiene non solo l'hash stesso ma un'indicazione di quale schema di hashing è utilizzato e di tutti i parametri necessari (nel caso di bcrypt a salt e un parametro di costo)
Quindi la risposta alla domanda se un "hash password" non valido non ha alcuna password funzionante non ha nulla a che fare con le funzioni hash, si riduce a come il codice di controllo gestisce gli input che non rappresentano un hash di password valido in uno dei formati supportati. Si spera che considererebbe un hash non valido come non corrispondente, ma la documentazione non è chiara, quindi dobbiamo leggere la fonte.
link
link
Leggendo il codice per php's password_verify troviamo che prima chiama "php_password_determine_algo", se la password inizia con $ 2y $ è considerato come "bcrypt", se inizia con "$ argon2i $" è considerato come argon2 , altrimenti è considerato "sconosciuto".
Se l'hash è "bcrypt" o "unknown" passa poi a chiamare php_crypt passandogli la password e l'hash, questo tenta di eseguire l'hash della password fornita usando il metodo e salt dalla password esistente, può farlo sia utilizzando un'implementazione interna o chiamando la funzione crypt del sistema operativo. Sembra che in caso di hash esistente non valido, il codice interno ricadrà su DES vecchia scuola, non è sicuro di quale sarà l'implementazione del sistema.
Tornando alla sezione sconosciuta / bcrypt in password_verify sembra che non riesca a corrispondere se una delle seguenti condizioni è vera.
- php_crypt restituisce un errore.
- la lunghezza dell'hash restituita da php_crypt non corrisponde alla lunghezza dell'hash passweed a password_verify
- l'hash passato a password_verify è inferiore a 13 caratteri di lunghezza
- il contenuto dell'hash restituito da php_crypt non corrisponde al contenuto dell'hash passato a password_verify
Il tuo hash di "-" verrà rifiutato dalla regola 3 almeno da questo elenco (probabilmente anche la regola 1 o 2, ma ciò dipende dal comportamento dell'implementazione della criptazione utilizzata).