パスワードに完全な Unicode を受け入れる場合、文字列をハッシュ関数に渡す前にどのように正規化すればよいですか?
目標
正規化しないと、あるコンピューターでパスワードを「mañana」( ma\u00F1ana
) に設定し、別のコンピューターで「mañana」( ) を使用してログインしようとするとma\u006E\u0303ana
、ハッシュが異なり、ログインに失敗します。これは、ユーザー エージェントまたはそのオペレーティング システムの制御下にあります。
- それらが同じものにハッシュされるようにしたいと思います。
- Α、А、A (ギリシャ語、キリル文字、ラテン語)などのホモグリフは気にしません。
参照
Unicode 正規化フォーム: http://unicode.org/reports/tr15/#Norm_Forms
考慮事項
- 正規化手順は、衝突を引き起こす可能性があります
"office" == "office"
。 - 正規化により、文字列のバイト数が変わる場合があります。
さらなる質問
- サーバーが有効な UTF-8 (またはその他の形式) ではないバイト シーケンスを受信した場合はどうなりますか? 正規化できないので拒否しますか?
- サーバーがそのバージョンの Unicode で割り当てられていない文字を受信するとどうなりますか?