Wie implementiere ich Unicode-Passwörter?

8

Das Hinzufügen von Unicode-Passwörtern ist ein wichtiges Feature, das Entwickler nicht ignorieren sollten.

Trotzdem ist das Hinzufügen von Unterstützung für Unicode in Kennwörtern ein kniffliger Job, da der gleiche Text in Unicode auf verschiedene Arten codiert werden kann und Sie deshalb nicht verhindern möchten, dass sich Benutzer anmelden.

Nehmen wir an, Sie speichern die Kennwörter als UTF-8 und berücksichtigen, dass diese Frage nicht mit Unicode-Kodierungen zusammenhängt und mit Unicode-Normalisierung zusammenhängt.

Nun stellt sich die Frage, wie Sie die Unicode-Daten normalisieren sollten ?

Sie müssen sicher sein, dass Sie es vergleichen können. Sie müssen sicher sein, dass bei der Veröffentlichung des nächsten Unicode-Standards Ihre Passwortverifizierung nicht ungültig wird.

Hinweis: Es gibt immer noch einige Stellen, an denen Unicode-Passwörter wahrscheinlich nie verwendet werden, aber diese Frage betrifft nicht Warum oder wann Unicode-Passwörter verwenden , es geht darum, sie in der richtigen Weise zu implementieren.

1. Aktualisierung

Ist es möglich, dies zu implementieren, ohne ICU zu verwenden, wie OS für die Normalisierung zu verwenden?

    
sorin 09.05.2010, 19:03
quelle

2 Antworten

6

Ein guter Anfang ist, Unicode TR 15: Unicode Normalization Forms zu lesen. Dann merkt man, dass es eine Menge Arbeit ist und zu seltsamen Fehlern neigt - Sie kennen diesen Teil wahrscheinlich schon, da Sie hier nachfragen . Schließlich laden Sie etwas wie ICU und lass es für dich tun .

IIRC, es ist ein mehrstufiger Prozess. Zuerst zerlegen Sie die Sequenz, bis Sie nicht weiter zerlegen können - zum Beispiel würde é zu e + werden. Dann ordnen Sie die Sequenzen in eine gut definierte Reihenfolge um. Schließlich können Sie den resultierenden Byte-Stream mit UTF-8 oder ähnlichem codieren. Der UTF-8-Byte-Stream kann in den kryptografischen Hash-Algorithmus Ihrer Wahl eingegeben und in einem persistenten Speicher gespeichert werden. Wenn Sie überprüfen möchten, ob ein Kennwort übereinstimmt, führen Sie die gleiche Prozedur durch und vergleichen Sie die Ausgabe des Hashalgorithmus mit dem, was in der Datenbank gespeichert ist.

    
D.Shawley 09.05.2010, 19:34
quelle
0

Eine Frage an Sie - können Sie erklären, warum Sie "ohne ICU" hinzugefügt haben? Ich sehe viele Fragen, die nach Dingen fragen, die ICU (wir denken) ziemlich gut, aber "ohne ICU". Nur neugierig.

Zweitens könnten Sie an StringPrep / NamePrep und nicht nur an der Normalisierung interessiert sein: StringPrep - um Strings für zu zeichnen Vergleich.

Drittens interessiert Sie vielleicht UTR # 36 und UTR # 39 für andere Unicode-Sicherheitsimplikationen.

* (Offenbarung: ICU-Entwickler:)

    
Steven R. Loomis 10.05.2010 17:40
quelle