Concorda con la tua analisi sul fatto che consentire i simboli consente una maggiore sicurezza, ma generalmente non è così tanto. Soprattutto se paragonato a una password leggermente più lunga (supponendo che la password sia composta da simboli scelti a caso). Usando uno dei 95 caratteri ascii stampabili:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\]^_'{|} ~
(un po 'di più se si contano caratteri come tabulazione o interruzione di riga come stampabili) una password di 8 caratteri ha possibilità 95 ^ 8 ~ 6,6 x 10 ^ 15, mentre con sole lettere (maiuscole e minuscole) e numeri una password di 8 caratteri ha 62 ^ 8 ~ 2,2 x 10 ^ 14 che è circa 30 volte più debole.
Tuttavia, una password di 9 caratteri con solo numeri + lettere minuscole + maiuscole è due volte più strong di una password di 8 caratteri che consente caratteri speciali. Quindi, a meno che non ci siano limiti rigidi sulla lunghezza di una password (e in realtà non ci sia mai bisogno di almeno una password di poche centinaia di caratteri), è facile passare a password leggermente più lunghe anche con un set di caratteri limitato.
I maggiori potenziali problemi di sicurezza sono se credono che consentire caratteri speciali nelle password possa causare problemi nella loro applicazione o database. Esiste un motivo legittimo per escludere caratteri ASCII non stampabili (ad esempio, caratteri di controllo ASCII NUL ( \b
), backspace ( '
), ecc.) Che potrebbero causare problemi, ma le applicazioni ben progettate dovrebbero essere in grado di gestire caratteri speciali regolari come -
o A3
senza essere vulnerabili agli attacchi di iniezione. Un'applicazione dovrebbe essere in grado di gestire questi tipi di caratteri come appaiono ad esempio nei nomi con citazioni o trattini in essi (ad es. Conan O'Brien, Daniel Day-Lewis). Inoltre, poiché le password non dovrebbero essere salvate nel database o restituite all'utente e immediatamente sottoposte a hash, non dovrebbe importare caratteri speciali ASCII stampabili.
Ci sono dei problemi di usabilità con caratteri speciali non ASCII come unicode, e per problemi di usabilità può essere una buona idea proibire questi caratteri o normalizzarli in un modo standard. In genere le funzioni di hash prevedono una stringa di byte e le password con caratteri speciali oltre ASCII possono essere codificate in diversi modi a livello di byte (ad esempio UTF-8, UTF-7, UTF-16, ISO-8859-1). Inoltre, oltre a codifiche diverse (che puoi mantenere coerenti a livello di applicazione), devi anche preoccuparti di lettere dall'aspetto identico con valori diversi in unicode. Ad esempio il seguente carattere Å è unicode 00C5 , ma questo carattere identico è Å < a href="http://www.fileformat.info/info/unicode/char/212b/index.htm"> unicode 212B mentre questo Å è in realtà di due caratteri - un ASCII A con un carattere di combinazione di unicode 030a aggiungendo un cerchio sopra l'A.
EDIT : Ho appena notato che hai elencato £ come uno dei tuoi simboli comuni. Sfortunatamente non è un simbolo ASCII standard. In ISO-Latin-1, è il byte C2 A3
. In UTF-8 sono i due byte +AKM-
. In UTF-7 sono i caratteri ASCII 00 A3
. In UTF-16 è '
. Queste diverse codifiche significano che la tua funzione di hash potrebbe rompersi su questo personaggio se non viene gestito correttamente. Certo, l'applicazione dovrebbe essere in grado di gestire correttamente la codifica, ma potrebbe non riuscire su alcuni sottoinsiemi di dispositivi. Inoltre, il personaggio potrebbe non essere disponibile su tastiere straniere.
Potrebbero esserci anche problemi di usabilità con caratteri come "
o ‘’“”
che in alcune applicazioni / piattaforme possono essere convertiti in virgolette intelligenti %code% (anche se questo non dovrebbe mai essere fatto in un contesto di password).
Infine, c'è un ulteriore razionale per avere regole di password univoche: rendere più difficile per gli utenti avere una password memorizzata che viene riutilizzata ovunque, che è una pratica di sicurezza orribile. Se la password "normale" dell'utente non soddisfa le regole univoche di un sito, quando la sua normale password viene compromessa su qualche altro sito casuale (che dice memorizza la password in chiaro), il suo account non viene compromesso nel sito con l'unico regole.