Espansione sul mio commento precedente:
If the two stored hashes (with and without the caps lock transformation) are the same, we can know that the user has no letters in their password. (Or at least has no lower case letters in their password depending on how you do the transformation.)
Dato che Mac e Windows (e Linux) gestiscono il blocco dei tappi in modo diverso, è necessario memorizzare due varianti dell'hash di trasformazione del blocco maiuscole: inversione del caso (Windows / Linux) e tutto maiuscolo (Mac). Ora possiamo determinare ancora di più sulla password dagli hash.
- Se tutti e tre gli hash sono uguali, l'utente non ha lettere (maiuscole o minuscole) nella sua password.
- Se l'hash di trasformazione di Windows è diverso ma l'hash di trasformazione Mac è lo stesso dell'hash principale, l'utente ha lettere maiuscole nella loro password ma nessuna lettera minuscola.
- Se tutti e tre gli hash sono diversi, l'utente ha entrambe le lettere maiuscole e minuscole nella loro password.
Un altro pensiero: è sicuro applicare lo stesso sale a tutte e tre le varianti? Anche se penso che dovrebbe essere, non vedo alcun vantaggio significativo nel farlo. Se applichi un sale diverso a tutti e tre gli hash, I pensa che le perdite di informazioni di cui sopra siano negate. Nota che non sono un crittografo, anche se non dovrebbero esserci perdite di informazioni quando si eseguono tre password correlate e possibilmente identiche con tre diversi sali, potrebbe essere necessario un tempo più lungo per essere sicuro.
Altri problemi:
Poiché abbiamo tre varianti di hash della password che devono essere controllate ogni volta che un utente sta effettuando l'accesso, è necessario calcolare tutti e tre gli hash. Se si utilizza bcrypt (o simile) con un numero appropriato di cicli di hashing, si vorrà ridurre quel numero di cicli in modo che il tempo impiegato sia circa 1/3 del vecchio valore. (Partendo dal presupposto che puoi impostare il numero di round più alto che puoi gestire e ora devi calcolare tre volte il numero di hash per accesso.)
Il motivo per cui è necessario calcolare tutti e tre gli hash anche se il primo o il secondo corrispondono è che, se non lo fai, abilita l'enumerazione delle credenziali tramite gli attacchi temporali. In teoria, per prevenire l'enumerazione delle credenziali è necessario fornire esattamente la stessa risposta, se l'utente non esiste o lo fa, ma la password è sbagliata. Se restituisci una risposta identica per entrambi i casi ma impiega millisecondi quando l'utente non esiste e un secondo intero quando l'utente esiste, hai comunque abilitato l'enumerazione delle credenziali.
Tutto sommato, penso che dovrebbe essere relativamente sicuro se usi diversi sali per tutti e tre gli hash, calcola sempre tutte e tre le variazioni della password fornita e riduci il numero di round in modo che i tempi siano ridotti di 1/3.
Tuttavia, potrebbe essere più semplice memorizzare un solo hash, controllare la password fornita dall'utente per le lettere minuscole e se non ce ne sono e l'hash non corrisponde, suggerire loro che potrebbero avere il blocco maiuscole.
Ultimi pensieri
Non è necessario memorizzare tre diversi hash come suggerito in precedenza se si prevede di accettare la trasformazione in stile Mac. È sufficiente mettere tutte le password in maiuscolo prima di eseguire l'hash e archiviare solo la versione maiuscola. Ciò impedisce anche gli attacchi temporali poiché è sufficiente calcolare un hash per accesso.
In questo modo hai ridotto il numero di possibili lettere / numeri / simboli che le persone possono utilizzare per 26, quindi potresti consigliare agli utenti di utilizzare una password leggermente più lunga per compensare.