メッセージのセキュリティ(正確に1つのメッセージが特定のハッシュにマップされることを意味する)を保証するためにハッシュの大きさを決定するための何らかのルールはありますか? 32ビットの数字や8文字のASCIIパスワードなど、任意のメッセージに適用できるもの。
ちょうど1つのメッセージが特定のハッシュにマップされます
ハト穴の原理により、これは不可能です。ハッシュ関数への入力メッセージがハッシュ自体より大きくなる可能性がある限り、一部のメッセージが互いに衝突して同じハッシュにマップされることは保証です。これは正常であり、それ自体でハッシュのセキュリティに問題はありません。
ハッシュ関数が大きすぎて意図的にそのような衝突(衝突攻撃)を見つけることが計算上実行不可能であることを確認する必要があるだけです。 nビットのハッシュダイジェストには、n/2ビットの衝突耐性があります。衝突攻撃に対して128ビットのセキュリティを実現するには、256ビットのハッシュダイジェストが必要です。これはもちろん、ハッシュが暗号的に安全であることを前提としています( SHA-256のように )。ショートカットを使って、ブルートフォースよりも簡単に衝突を見つけることができる攻撃は避けてください。
それはあなたが何を達成したいかに大きく依存します。第1に、フォレストで既に指摘されているように、1つの入力マップ1つだけのハッシュに関して実際に必要なのは、一般的なケースでは不可能です。 可能ハッシュが入力と同じかそれより長い場合の特殊なケース。 32ビット整数について言及したので、実際には32ビット整数から整数へのハッシュが存在します。
ただし、可能な入力数は32ビットで非常に少ないため、ルックアップテーブルを作成することは実際にはかなり可能です(たった32GBしか消費しないため、現在使用しているコンピューターでは、ルックアップテーブルRAMに完全に収まります!)。言うまでもなく、これは安全ではなく、実際に使用しているアルゴリズムに関係なくたぶん安全ではありません。
ハッシュで何か(ファイルや文字列など)を識別することを計画していて、悪意のある改ざんがではない検討事項であるか、少なくとも最初の検討事項ではない場合優先度が高い場合、64ビットは「十分に良い」であり、128ビットは「絶対に安全」であると考えることができます。
CRC32は、暗号で保護されたハッシュによって提供される保証さえ提供しないため、物事を区別し、偶発的な変更を長年確実に識別するための「かなり良い」と認められています(64ビットはまったく異なる桁数です) 32と比較して!!!)。 IDs は128ビットであり、明らかに一意でない場合は「一意」と見なされます。しかし、すべての実用的な問題について、彼らはです。
Linuxカーネルやbillionsのデバイスで使用されるその他のセキュリティ関連のソフトウェアをホストするために使用されるGITを追加するつもりでした(そのため、攻撃の非常に興味深いターゲットになります) 128ビットハッシュは、データを分離して安全に保つために使用しますが、実際には160ビットです...
さて、悪意のある改ざんが懸念される場合、あなたは可能性が高い安全ハッシュアルゴリズム(そのため、CRCはトリックを実行しませんが、必要に応じてビットは必要ありません。それは、何をどのように保護したいか、そしてどのような種類の攻撃から保護するかにかかっています。
SiphashまたはCityhash(デフォルトでは、元の/共通構成では、32ビットと128ビットのバリアントもあります)は、ちょうど64ビットです。これは非常にうまく機能し、使用する場合は絶対に安全です。インターネット経由で送信する適切なサイズのメッセージの整合性を確保するため。十分に強力な攻撃者は、15〜20分以内に衝突を見つけることができますか?承知しました。しかし、誰が気にかけているか、15分後には14分59秒では遅すぎて、彼はそれを使って何かを行うことができません。
一方、長期間保存されるものに使用する場合はまったくないで問題ありません。
その場合、必要なのは少なくとも 128、より良い160ビットであり、妥当な確実性で「絶対に安全」と言うためには、256ビット以上が必要ですが、これにも依存しますwhat正確にあなたが欲しい。 「ほとんどすべての人にとって十分に良い」と見なされているAES-CGMは、最大128ビット(96まで)です。
攻撃者は2つの入力を選択できるようになっているので、誕生日攻撃が適用されますか?その場合、128ビットは64ビットにしか値しません(または、予測が保持されている場合は、量子コンピューターでは42ビットです)。それは間違いなく少し貧弱で、「十分に安全」は言うまでもなく、「十分に良い」と言うには十分ではありません。
あなたはonly攻撃を心配しています2番目のプリイメージ攻撃、つまり、入力の1つを選択していますか?その場合、128ビットは「強力」、160ビットは「解読不能」、256ビットは「途方もなく解読不可能」になります。アルゴリズム自体が壊れていない限り、それはです。
tl; dr
全体として、前提条件を考慮する必要のない無条件の回答を好む場合は、その回答が256以上であることを考慮する必要があります。
256ビットは「途方もなく不可能」の領域にありますが、アルゴリズムは時間の経過とともに壊れることを考慮する必要があるため、256ビットアルゴリズムmightは、2のワークロードの価値があるだけです^ 10〜20年で140または2 ^ 150、知る方法はありません。あなたが少し妄想的であるなら、それはあなたが「絶対に安全」と言うのに十分ではないかもしれません(ほとんどの人にとって、それはまだ十分だと思います)。
したがって、あなたのパラノイアのレベルを知らずに、「256以上」と言います。いくつかのビットを追加しても実際にはそれほどコストはかかりませんが、巨大の影響があります。 384または512にしてください。 512ビットのアルゴリズムが非常に、非常に著しく壊れていて、たとえば2 ^ 300のワークロードに弱くなっている場合、そして数学および物理的に不可能を適用することにより、パラ次元の異星人によって発明された超量子スーパーマジックコンピュータは可能ですマジック、それをさらに2 ^ 150ビットのワークロードに減らしてください。
ハッシュ関数の出力サイズは、そのセキュリティレベルに上限を設定します。暗号化ハッシュ関数に期待される3つの主要な特性は、衝突、最初のプリイメージ、および2番目のプリイメージの攻撃に対する耐性です。
アルゴリズムにn-bitのセキュリティがある場合、関連するセキュリティプロパティを破壊する攻撃がなく、2をはるかに下回る必要があります。n 成功するためのステップ(およそと平均で)。 nが十分に大きければ、システムを攻撃するのに十分な計算能力を誰も持っていないことは事実上確実です。
n-bit出力のハッシュ関数から、プリイメージ攻撃に関しては最大n-bitのセキュリティが期待できますしかしそれ以上 。仮説上、ブルートフォースでプレイメージを検索し、平均して2n 試行します。)
ただし、衝突抵抗の場合、 誕生日の問題 は、nビットの代わりに2 * nビットが必要になることを意味します。
多くの場合、128ビットのセキュリティを目指しているため、許容可能な最小のダイジェストサイズは256ビットです。 128ビットのセキュリティでは、十分に大きなセキュリティマージンが確保されるため、出力ビットを少し減らしても安全ですが、使用するビットが少なすぎると危険です。
注:これは上限です。 Murmur3、CityHash、xxHashなどのアルゴリズムは、高品質で出力が長いと主張する場合がありますが、意味のあるセキュリティは提供されません。
出力サイズのみに基づいてアルゴリズムを選択しないでください。出力サイズは、ハッシュの最大理論強度のみを決定します。その実際の強さではありません。
代わりに、人々が安全であると人々が同意する衝突耐性のあるハッシュ関数を選択してください。 Blake-2、SHA-3、Skein、またはSHA-2。
注2:SHA-512のようなものを使用している場合、個別の入力が常に一意の出力になるようにアルゴリズムを処理できます。確率が1にほぼ等しい場合、実際の入力セットの重複ダイジェストは取得されません。
ダイジェストが衝突する実際の確率は、ハッシュしようとするメッセージの数と、可能な出力の数に依存します。ハッシュを計算する能力は限られているため、ハッシュしようとする個別のメッセージの数は当然制限されます。
ハッシュ関数は真に単射ではありませんが、ソフトウェア開発者は大きな衝突耐性ハッシュ関数を使用して、それが本当であるかのように扱うことができます。不注意で1つ以上の衝突が発生する可能性は技術的にはゼロではありませんが、人の脳はそれがどれほど信じられないほどありそうもないことを理解できません。
各メッセージダイジェストが正確に1つのメッセージに対応するようにする必要がある場合、ダイジェストは可能な限り長いメッセージと同じ大きさでなければなりません。
メッセージを巨大なNビット整数として受け取り、可逆関数を使用してメッセージから別のNビット整数を計算します。これを行う1つの方法は、対称暗号で暗号化することです(その暗号のキーはハッシュ関数を指定します)。
もちろん、メッセージダイジェストの重要な要件は固定された小さなサイズであり、ダイジェストされたメッセージ自体よりもはるかに小さいことが多いため、最も長いメッセージと同じ長さのハッシュは実用的ではありません。
ただし、何らかの理由で小さなメッセージを衝突のないコードに変換する必要があり、メッセージの復元が困難な場合は、上記の方法で実現できます。