12

興味深い問題が発生しました。「HMACSHA256」ハッシュのComputeHash()が決定論的に動作していないようです。HashAlgorithm.Create( "HMACSHA256")を使用してHashAlgorithmのインスタンスを2つ作成すると、ComputeHashを実行します。 2つの異なる結果が得られます。以下は、この動作を示す静的クラスの例です。

internal static string HashPassword(byte[] bAll)
{
    using (HashAlgorithm s = HashAlgorithm.Create("HMACSHA256"))
    {
        return Convert.ToBase64String(s.ComputeHash(bAll));
    }
}

また、呼び出しを非静的にしようとしました(実際には非静的に開始され、入力配列を2倍、3倍、4倍にチェックしました。各呼び出しでまったく同じです。のようなウィンドウ:

Convert.ToBase64String(HashAlgorithm.Create("HMACSHA256").ComputeHash(bAll)

そして、メソッドのブレークポイントを介してイミディエイトウィンドウで2回実行すると、2つの異なるハッシュが返されます。

私はハッシュが決定論的であると想定されていることを知っています。デバッガーでの実行で何かが起こっていますか?または他のアイデアはありますか?本当にこれは今の言葉にとって奇妙な2つです:-P..

ありがとうジョシュ

4

3 に答える 3

24

HMACはキー付きハッシュです。サンプルコードにキーが表示されません。

HashAlgorithm.Create("HMACSHA256")HashAlgorithmインスタンスを作成するため、キーについては何も知りません。おそらくこれをHMACSHA256コンストラクターと呼んでいます:

public HMACSHA256()

ランダムに生成されたキーを使用して、HMACSHA256クラスの新しいインスタンスを初期化します。

このコンストラクタが必要です:

public HMACSHA256(byte[] key)

指定されたキーデータを使用して、HMACSHA256クラスの新しいインスタンスを初期化します。

HMACアルゴリズムをハードコーディングしたくない場合は、KeyedHashAlgorithm.Createを使用して、 KeyedHashAlgorithm.Keyプロパティを設定することで特定のキーを指定できます。

キーを使用したくない場合は、SHA256のようなキーなしのハッシュを使用してください。

于 2010-07-06T13:27:42.877 に答える
5

誰かに私が経験した頭痛を救うことを期待してこれに追加するだけです。

.Netメンバーシッププロバイダーの場合は、web.configまたはapp.configに設定があることを確認してください。それ以外の場合は、自動的に独自のキーを生成します...認証に失敗し、最後にあなたを大笑いします。

于 2010-10-11T18:13:50.970 に答える
3

HMACSHA256のキーが必要です。キーがコンストラクターに渡されない場合、キーはランダムになります。

于 2010-07-06T13:28:43.590 に答える