17

パスワードに完全な Unicode を受け入れる場合、文字列をハッシュ関数に渡す前にどのように正規化すればよいですか?

目標

正規化しないと、あるコンピューターでパスワードを「mañana」( ma\u00F1ana) に設定し、別のコンピューターで「mañana」( ) を使用してログインしようとするとma\u006E\u0303ana、ハッシュが異なり、ログインに失敗します。これは、ユーザー エージェントまたはそのオペレーティング システムの制御下にあります。

  • それらが同じものにハッシュされるようにしたいと思います。
  • Α、А、A (ギリシャ語、キリル文字、ラテン語)などのホモグリフは気にしません。

参照

Unicode 正規化フォーム: http://unicode.org/reports/tr15/#Norm_Forms

考慮事項

  • 正規化手順は、衝突を引き起こす可能性があります"office" == "office"
  • 正規化により、文字列のバイト数が変わる場合があります。

さらなる質問

  • サーバーが有効な UTF-8 (またはその他の形式) ではないバイト シーケンスを受信した場合はどうなりますか? 正規化できないので拒否しますか?
  • サーバーがそのバージョンの Unicode で割り当てられていない文字を受信するとどうなりますか?
4

1 に答える 1

12

不正なバイト シーケンスを含むとされる UTF-8 テキストなど、不正な形式の入力の場合、正規化は未定義です。不正なバイトは、拒否、置換、省略など、環境によって解釈が異なる場合があります。

推奨事項 #1 : 可能であれば、予想されるエンコーディングに準拠しない入力を拒否します。(ただし、これはアプリケーションの制御外である可能性があります。)

Unicode Annex 15 は、入力に割り当てられた文字のみが含まれている場合の正規化の安定性を保証します。

11.1 正規化された形式の安定性

すべてのバージョンで、Unicode 4.1 より前であっても、次のポリシーに従います。

正規化された文字列は安定していることが保証されています。つまり、正規化された文字列は、Unicode の将来のすべてのバージョンに従って正規化されます。

より正確には、文字列が特定のバージョンの Unicode に従って正規化され、そのバージョンで割り当てられた文字のみが含まれている場合、Unicode の将来のバージョンに従って正規化されたものとして認定されます。

推奨事項 #2 : どちらの正規化形式を使用する場合でも、安定化文字列の正規化プロセスを使用する必要があります。つまり、割り当てられていない文字を含むパスワード入力を拒否します。これは、正規化がサーバーのアップグレードで安定しているとは保証されないためです。

互換性正規化形式は日本語をより適切に処理しているようで、標準形式では処理されないいくつかの分解を同じ出力にまとめます。

仕様では次のように警告されています。

正規化形式 KC および KD を任意のテキストに盲目的に適用してはなりません。それらは多くの書式設定の区別を消去するため、多くのレガシー文字セットとの間の往復変換を防ぎ、書式設定マークアップに取って代わられない限り、テキストのセマンティクスにとって重要な区別を削除する可能性があります。

ただし、セマンティクスとラウンドトリップはここでは問題になりません。

推奨事項 #3 : ハッシュする前に NFKC または NFKD を適用します。

于 2013-04-23T15:26:32.913 に答える