1

私はエッジケースを持っています。商用のクローズド ソース ツールによって生成されたバイナリ データファイルを読み取るコードを作成しています。データ形式に関する情報はドキュメントで指定されています。

データ整合性チェックの場合、ベンダーの仕様では、RFC2898 に従ってパスワードから派生したキーを使用して、SHA1 に基づくHMACを要求しています。多くのプログラミング環境には、これらのハッシュを生成する HMACSHA1 というクラスがあります。

ゼロ以外の長さのデータ ストリームの場合、ハッシュを正常に計算でき、コード内の計算はベンダーの実装と一致します。つまり、私のコードは、ベンダーが作成したファイルを読み取って認証でき、その逆も可能です。

ただし、データ ストリームの長さがゼロの場合、ベンダーのツールは、すべてがゼロではないハッシュを発行します。HMACSHA1 を実行するメッセージがない場合、どこから来たのかわかりません。

HMACSHA1 の場合、または任意の HMAC の場合、MAC は「ヌル メッセージ」のエッジ ケースに対して定義されていますか?

私の質問はプラットフォームに依存しないと思いますが、 私は.NETとクラスSystem.Security.Cryptography.HMACSHA1を使用しています。


プラットフォーム固有のビットが 1 つあります。そのタイプのインスタンスで Hash プロパティを取得しようとすると、インスタンスを介してデータを実行していない場合、取得されます。

Exception: System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Security.Cryptography.HashAlgorithm.get_Hash()

ハッシュするものがないので、これはまったく驚くべきことではありません。

ヒントはありますか?

4

3 に答える 3

4

HMACSHA1 は、n ビットのすべての入力に対して定義されます。ここで、0 <= n < 2^20 - 160 です。

HMACSHA1 は SHA1( K*|| SHA1( K**|| text ) ) として定義されます。ここで、K*K**はキーから派生した 20 バイト長の値です ( FIPS 198aを参照)。

したがって、HMACSHA1( "空の文字列" ) = SHA1( K*|| SHA1( K**) ) となります。これは非常に明確に定義されています。

于 2009-07-27T10:48:05.683 に答える
3

暗闇の中をぶらぶらしていると、必要なものが見つかりました。長さゼロのメッセージの場合に HMACSHA1 が定義されているかどうかはわかりませんが、

.NET で、HMACSHA1.ComputeHash() を呼び出して長さ 0 のバイト配列を渡すと、期待どおりの目的のハッシュが得られることがわかりました。

お騒がせして申し訳ありません。以前にスケジュールされていた番組に戻ります。

于 2009-07-27T03:14:19.263 に答える
1

長さゼロの配列をハッシュに追加しようとする必要がありますか? 基になるオブジェクトは、最初の呼び出し中に作成される可能性があります。

長さゼロのファイルをハッシュするいくつかの実装を使用すると、次のようになります。

MD5   : d41d8cd98f00b204e9800998ecf8427e
SHA-1 : da39a3ee5e6b4b0d3255bfef95601890afd80709
于 2009-07-27T03:19:02.657 に答える