メインコンテンツまでスキップ

4.1. Salt (ソルト)

4.1. Salt (ソルト)

パスワードベース暗号におけるソルトは、伝統的に、与えられたパスワードに対応する大きな鍵のセットを生成する目的を果たしてきました。そのうちの1つがソルトに応じてランダムに選択されます。セット内の個別の鍵は、鍵導出関数 KDF を適用することで選択されます:

DK = KDF (P, S)

ここで、DK は導出鍵、P はパスワード、S はソルトです。これには2つの利点があります:

  1. 攻撃者が辞書のパスワードに対応するすべての鍵、または最も可能性の高い鍵を事前計算することは困難です。たとえばソルトが64ビット長の場合、各パスワードに対して最大 2^64 個の鍵が存在します。したがって、攻撃者は、パスワードベースの操作が実行されソルトが判明した後に、パスワードの検索に制限されます。

  2. 同じ鍵が2回選択される可能性は低いです。繰り返しになりますが、ソルトが64ビット長の場合、Birthday Paradox によれば、約 2^32 個の鍵が生成されるまで、鍵間の「衝突」は重要にはなりません。衝突が起こりにくいという事実は、一部の暗号化および認証技術を使用する際に生じる可能性のある、同じ鍵の複数の使用間の相互作用に関するいくつかの懸念に対処します。

パスワードベース暗号化では、メッセージを暗号化する当事者は、パスワードから暗号化鍵を導出する際に、大きくて十分にランダムなソルトを選択するだけで、これらの利点が実現されることを保証できます。メッセージ認証コードを生成する当事者も、同様の方法でそのような保証を得ることができます。

しかし、メッセージを復号化したり、メッセージ認証コードを検証したりする当事者は、別の当事者が提供したソルトが実際にランダムに生成されたと確信することはできません。たとえば、同じ鍵の複数の使用間の相互作用を悪用する試みで、ソルトが別のパスワードベース操作からコピーされた可能性があります。たとえば、2つの正当な当事者が暗号化されたメッセージを交換する場合を考えてみましょう。ここで、暗号化鍵は、あるソルトを使用して共有パスワードから導出された80ビットの鍵です。攻撃者は、その暗号化からソルトを取得し、40ビット鍵のためのものであるかのように、一方の当事者に提供することができます。当事者が40ビット鍵での復号化の結果を明らかにすると、攻撃者は40ビット鍵を解くことができる可能性があります。40ビット鍵が80ビット鍵の前半である場合、攻撃者は80ビット鍵の残りの40ビットを容易に解くことができます。

このような攻撃を防ぐためには、同じ鍵の複数の使用間の相互作用を注意深く分析するか、ソルトに異なる操作を明示的に区別するデータを含める必要があります。たとえば、ソルトには、導出鍵が暗号化用、メッセージ認証用、または他の操作用であるかを指定する、追加の非ランダムオクテットが含まれる可能性があります。

これに基づいて、ソルト選択に関しては以下が推奨されます:

  1. 与えられたパスワードに対してサポートされるパスワードベース暗号化および認証技術で、同じ鍵 (またはその鍵のプレフィックス) の複数の使用間の相互作用について懸念がない場合、ソルトはランダムに生成される可能性があり、ソルトを受け取る当事者が特定の形式をチェックする必要はありません。少なくとも8オクテット (64ビット) 長であるべきです。

  2. それ以外の場合、ソルトには、少なくとも8オクテット長のランダム部分に加えて、異なる操作と異なる鍵長を明示的に区別するデータを含める必要があり、このデータはソルトを受け取る当事者によってチェックまたは再生成される必要があります。たとえば、ソルトには、導出鍵の目的を指定する追加の非ランダムオクテットを含めることができます。あるいは、導出鍵に関する詳細情報、たとえば暗号化または認証技術や、パスワードから導出された異なる鍵間のシーケンス番号を指定する構造のエンコーディングである可能性があります。追加データの特定の形式は、アプリケーションに委ねられます。

注記: ランダム数生成器または疑似ランダム生成器が利用できない場合、ソルト (またはそのランダム部分) を生成するための決定論的な代替手段は、パスワードベース鍵導出関数を、パスワードと処理されるメッセージ M に適用することです。たとえば、ソルトは鍵導出関数を使用して S = KDF (P, M) として計算できます。ただし、このアプローチは、メッセージ M が小さなメッセージ空間に属することが知られている場合 (たとえば、「Yes」または「No」)、推奨されません。その場合、可能なソルトの数は少なくなります。