web-dev-qa-db-ja.com

組み込みシステムでの大きなファイルのハッシュ

サーバーから組み込みシステムにダウンロードするファイルの信頼性を確認する方法を考え出そうとしています。ハッシュ(できればSHA256)の使用を考えています。私の主な懸念は、ファイルサイズが大きすぎてバッファにロードしてハッシュ関数に渡すことができないことです。

オンラインで検索しているときに、ファイル全体のハッシュではなくハッシュツリーの計算について説明するこの回答( https://crypto.stackexchange.com/a/19805 )に出くわしました。これは有効なアプローチですか?これを別の方法で行うためのアドバイスはありますか?

7
Aravind

最初から最後まで順番にファイルを受信する限り、増分的にハッシュを計算できます。組み込みシステムに適した暗号化API(およびそうでないもののほとんど)を使用すると、入力の連続したチャンクを渡すことによってハッシュを計算できます。チャンクを受け取るたびに、入力をハッシュ計算に送り、それをファイルに追加します。送信が終わったら、ハッシュ計算を終了し、ハッシュが正しくない場合はファイルを消去します。

ハッシュはファイルの整合性のみを検証でき、信頼性は検証できないことに注意してください。これは、デバイスが事前にハッシュ値を知っている必要があることを意味するため、別のチャネルを介してハッシュを送信する必要があります。これは通常、低速だが信頼できるチャネルを使用してハッシュ(エンドツーエンドTLSを信頼できるサーバーに送信するなど)と、帯域幅は大きいがファイル自体のセキュリティは低いチャネル(ブロードキャストメカニズムなど)を使用して行われます。

ハッシュツリーは、ファイル全体を取得せずにファイルの一部を個別に確認できるようにする必要がある場合にのみ役立ちます。ファイルを順番に完全に取得している場合は、役に立ちません。

SHA-2のメモリ要件は、メッセージのサイズとは関係ありません。

ほとんどの暗号化ハッシュが機能する方法は、正確に直感的ではありません。それはすべて、初期値から始まり、ダイジェストを並べ替えるブロックサイズの単一の入力を取得する関数です。ハッシュの内部状態はなく、後続の各ブロックは単にダイジェストをもう少し並べ替えます。与えられたダイジェストと与えられた入力ブロックは、常に同じ新しいダイジェストになります。これは、MD5およびSHA-2が使用する Merkle–Damgård構文 の背後にあるアイデアの1つです。各入力ブロックのハッシュ操作は、メッセージ全体に関係なく、個別かつアトミックです(ただし、最後の パディング ブロックは、ハッシュされるメッセージの全長をエンコードします)。ファイルをハッシュすることは、これを繰り返し行うことを単純に含みます。標準で指定された初期値から始まり、ハッシュするブロックがなくなると終了します。 SHA-2ダイジェストを計算するために必要なものは3つだけです。

  • 現在のダイジェスト、または初期値。これはハッシュのサイズです。
  • 次の入力ブロック(ハッシュサイズに応じて512ビットまたは1024ビット)。
  • ハッシュ操作中の内部状態。各ブロックで同じです。

FIPS-180-4 §5.2から、メッセージは個別のブロックに分割して解析されます。

5.2メッセージの解析
メッセージとそのパディングを解析して、 Nメートル-ビットブロック。
 
5.2.1 SHA-1、SHA-224、SHA-256
 SHA-1、SHA-224、SHA-256の場合、メッセージとそのパディングは次のように解析されます N
 512ビットブロック、 M(1)、 M(2)、...、 MN。入力ブロックの512ビットは
 16個の32ビットワードとして表現できるため、メッセージブロックの最初の32ビット  
が示されている M、次の32ビットは M1、など M155.2.2 SHA-334、SHA-512、SHA-512/224およびSHA-512/256
 SHA-384、SHA-512、SHA-512/224、SHA-512/256の場合、メッセージとそのパディングは
に解析されます N1024ビットブロック、 M(1)、 M(2)、...、 MN。入力
ブロックの1024ビットは16個の64ビットワードとして表現できるため、メッセージブロックの最初の64ビット
 示されている M、次の64ビットは M1、など M15

SHA-1、SHA-256、およびSHA-512の場合、内部状態のサイズはダイジェストと同じ大きさです(SHA-224やSHA-512/224などの他のハッシュは、大きな値の切り捨てられたバージョンで、開始値が異なります) )。つまり、SHA-256を使用するユースケースでは、256ビット(32バイト)のデータを保存するだけで、0ビットから2までの任意のサイズのデータ​​のダイジェストを計算できます。64 -1ビット(この制限は、64ビットブロックでメッセージのサイズをエンコードする、使用されるパディングによるものです)。さまざまな最適化によりメモリ要件が増加する可能性がありますが、組み込みシステムにとっては十分ではありません。

一部の新しいハッシュ関数は 長さ拡張攻撃 を回避するために、出力ダイジェストサイズよりも大きい内部状態を持っています。ここで、mを知らずに、ダイジェスト、m 'のダイジェストを計算できます。m'の内容で始まりますm。たとえば、SHA-3(ダイジェストサイズに関係なく)では、これを防ぐために内部状態が1600ビットと大きくなっています。これにより、単一のハッシュ操作が内部状態に依存することが保証されます。これは、最後のダイジェストがリリースされたときに最後に明らかにされません。

2
forest

事実上すべてのハッシュ関数、そして確かに使用に値するすべてのハッシュ関数(そう、SHA-256を含む)は、ストリーミング方式で使用できます。ファイル全体を単一のチャンクでハッシュする必要はありません。代わりに、ファイルを小さく分割してフィードし、完了したら最終的なハッシュ値を取得できます。

1
Mark