私のc#アプリケーションでは、アップロードする人が会社のデータベースにアップロードする前に、RSAを使用してファイルに署名しています。ここでは、ハッシュの計算にSHA-1またはSHA-2を選択する必要があります。
プログラミングの他のコンポーネントと同様に、2つには「ここでこれを使用する」と「そこで使用する」必要があることを私は知っています。
それで、これはいつですか?そしていつそれ?
編集:
私の質問は:パフォーマンスに関する違いは何ですか?セキュリティについてではありません。SHA-2はSHA-1よりも安全性が高いことをすでに知っています。
この リンク さまざまなタイプのSHA-2の比較で、SHA-512を使用する場合と使用しない場合を示しています。 SHA-1とSHA-2についても同様の議論が必要です。
SHA-2を使用します。常に。 SHA-1は、レガシーコードとの相互運用性の問題が原因でSHA-2を使用できない場合に予約されます。
実際の対策が行われるまで、パフォーマンスの問題はありません。ハッシュ関数は高速です。ほとんどの場合、ハッシュ関数のパフォーマンスはほとんど無視できます。それを検出することさえ困難であると判明するかもしれません。セキュリティが最優先されます。 SHA-1には弱点が発見されているため、SHA-1を使用するには、いくつかの堅牢な正当化が必要です。 SHA-256を使用しても問題ありません。これが「デフォルトの選択」です。ただし、SHA-1を使用する場合は、批判される準備をしてください。
「SHA-2」として知られる4つの関数があることに注意してください:SHA-224、SHA-256、SHA-384およびSHA-512。 SHA-224とSHA-256は同じ機能ですが、内部パラメーター(「初期値」)と出力サイズ(SHA-224の出力サイズは28バイトですが、SHA-256は32バイトを提供します)を除きます。それらは同じパフォーマンス特性を持っています。同様に、SHA-384とSHA-512は、パフォーマンス的には同じ機能です。 SHA-512は64ビットの算術演算を使用し、64ビットのオペコードを提供するプラットフォームではSHA-256よりも高速です。 32ビットプラットフォームでは、SHA-256の方が高速になります(注:ネイティブコードを使用する32ビットx86では、SSE2 opcodeとその64ビットコンピューティング機能を使用できるため、someSHA-512のネイティブコード実装は32ビットモードのSHA-256よりも高速です; OpenSSLコードはそれを行います;しかし、私が知る限り、.NETでのSHA-512実装は「マネージドコード」です")。また、すべてのSHA- *関数は、データをチャンクで処理するため、基本的な細分性を備えています。SHA-256の場合、チャンクは64バイト長ですが、SHA-512は128バイトのチャンクを使用します。非常に短いデータ要素をハッシュする場合、SHA-512の粒度が高くなると、それに応じてパフォーマンスが低下します。最後に、SHA-256(32ビットプラットフォーム上)では、コードが小さくなる可能性があります(つまり、CPUで使用するL1キャッシュが少なくなります)。
したがって、疑わしい場合は、SHA-256を使用してください。 SHA-1の使用を計画している場合は、疑う必要があります。
暗号化以外の用途にハッシュ関数を使用する場合(つまり、弱点は問題ではない)、SHA-1の代わりに MD4 を検討してください。
SHA-2はより強力で、デジタル署名などのセキュリティに敏感なアプリケーションに適しています。
SHA-1は、より短いハッシュが必要で、セキュリティが問題にならない場合に適しています(ファイルのチェックサムなど)。
編集:SHA-1アルゴリズムは高速です(少なくとも.NET実装では、256ビットのSHA-2よりも最大10倍、512ビットのSHA-2よりも20倍高速です)。
ただし、どちらもそれほど遅くはありません。概観すると、最新のコンピューターでは、100KBのファイルをSHA-2(256ビット)で数ミリ秒でハッシュする(または1MBのファイルを数十ミリ秒で)と予想できます。 。
実際にはありません。セキュリティのレベルや望まれるパラノイアによって異なります。新しいアプリケーションにはSHA256を使用しますが、これには、SHA256フィンガープリント全体をペイロードとして処理できる十分に大きなRSAキーが必要です。