Potrebbero esserci motivi legittimi per limitare l'insieme di caratteri consentiti nelle password. Ad esempio, se la password conteneva un carattere che non era un carattere ASCII stampabile, i problemi di codifica potrebbero potenzialmente causare il rifiuto di una password corretta in determinate circostanze.
Inoltre, se un utente può, in momenti diversi, dover digitare la stessa password su diversi layout di tastiera, può essere problematico utilizzare caratteri che si trovano in modo diverso su quei layout di tastiera.
Un avversario potrebbe essere in grado di capire quali utenti sono interessati dai suddetti problemi e in questo modo ottenere una certa conoscenza dei caratteri che gli utenti hanno usato nella loro password.
Limitare l'insieme di caratteri consentiti per i motivi sopra indicati non deve indebolire la forza delle password. Tutto quello che devi fare è rendere la password leggermente più lunga. (Nel caso estremo, se passassi dal consentire a tutti gli ASCII stampabili di consentire solo lettere minuscole, dovresti aumentare la lunghezza della password del 40% per avere la stessa entropia.)
Ci sono anche cattive ragioni per limitare il set di caratteri consentiti. Ad esempio, se un sistema limita l'insieme di caratteri consentiti per prevenire attacchi di SQL injection, ti dirà due difetti di sicurezza nel sistema. Prima di tutto, non usa la corretta escaping per le query SQL. In secondo luogo, chiaramente non usa alcun hashing delle password.
Per la lunghezza della password una limitazione può essere una buona idea solo per evitare problemi nel caso in cui alcuni client impongono limitazioni arbitrarie sui campi di input. Ad esempio, se qualcuno ha pensato che fosse una buona idea usare un carattere firmato per indicare la lunghezza di un campo, allora non avrebbe più di 127 caratteri al massimo. Ho realizzato sistemi in cui ho imposto una lunghezza massima di 125 caratteri sulle password come precauzione contro tali possibilità (e forse un paio di errori off-by-one).
L'applicazione di una lunghezza massima alle password riduce la sicurezza se la lunghezza massima è troppo breve. Dovresti confrontare con le primitive crittografiche simmetriche che potresti usare. Ciò significa che dovremmo confrontarci con le dimensioni dei blocchi e delle chiavi dei codici a blocchi e con l'output delle funzioni di hash. Ciò significa che normalmente ci aspetteremmo da 128 a 512 bit di sicurezza dai nostri primitivi crittografici. Disabilitare le password che potrebbero corrispondere a quei livelli di sicurezza sarebbe controproducente. A seconda dell'insieme di caratteri consentito, potrebbero esserci da 4.7 (solo lettere minuscole) a 6.57 (tutti ASCII stampabili) bit di entropia per carattere in una password complessa. Con un po 'di matematica vediamo che se non permettiamo almeno 20 caratteri, imposteremo sicuramente il limite troppo basso e se consentiremo 109 caratteri dovremmo essere molto al sicuro.
È improbabile che uno dei limiti superiori a 100 o 125 abbia un impatto reale sulla sicurezza, perché molto probabilmente nessun utente sta per arrivare così in alto.
Quando si menziona una lunghezza massima di 16 caratteri che viene applicata, indica che probabilmente i progettisti hanno introdotto tale limite per una cattiva ragione. Una cattiva ragione potrebbe essere che la password viene archiviata come testo normale e solo 16 caratteri sono stati allocati per la memorizzazione. Un altro motivo non altrettanto negativo sarebbe che la password è utilizzata direttamente come chiave per una primitiva crittografica (come AES).
La combinazione delle due restrizioni (non consentendo due caratteri specifici e un piccolo limite massimo) è un segnale di avviso, poiché ciascuna di esse potrebbe essere una scelta fatta a causa della memorizzazione delle password come testo normale.
Che la coppia specifica di personaggi che hanno deciso di non accettare sono spazi e tagli di suoni spaventosi, perché le ragioni che potrei immaginare per quei due caratteri specifici che non sono consentiti è che potrebbero voler mettere la password in testo in chiaro nel nome di un file o una riga di comando. Speriamo che sia solo una questione di me che manca un po 'di immaginazione.