Computehashが決定論的に行動しないのはなぜですか?
-
02-10-2019 - |
質問
私は興味深い問題に遭遇しました。「hmacsha256」ハッシュのcomputehash()は決定論的に動作していないようです。ハスハルゴリスM.Create( "hmacsha256")を使用してハスハルゴリズムの2つのインスタンスを作成した場合、computehashを実行します。 2つの異なる結果が得られます。以下は、この動作を示す静的クラスの例です。
internal static string HashPassword(byte[] bAll)
{
using (HashAlgorithm s = HashAlgorithm.Create("HMACSHA256"))
{
return Convert.ToBase64String(s.ComputeHash(bAll));
}
}
また、コールを非静的にしようとしました(実際には静的ではありません。そして、私の入力配列をチェックしたダブルとトリプルとQuadrudrupleがあります。各コールでまったく同じです。のような窓:
Convert.ToBase64String(HashAlgorithm.Create("HMACSHA256").ComputeHash(bAll)
そして、メソッドのブレークポイントを介してイミディエートウィンドウでそれを2回実行すると、2つの異なるハッシュが戻ります。
ハッシュが決定論的であると思われることを知っています。デバッガーで走ることで何かが起こっていますか?または他のアイデアはありますか?本当にこれは今の言葉では2つの奇妙なものです:P ..
ジョシュに感謝します
解決
HMACはキー付きハッシュです。あなたのサンプルコードにキーが表示されません。
HashAlgorithm.Create("HMACSHA256")
Hashalgorithmインスタンスを作成するため、キーについて何も知りません。おそらく電話するだけです このHMACSHA256コンストラクター:
public HMACSHA256()
hmacsha256クラスの新しいインスタンスをの初期化 ランダムに生成されたキー.
あなたが欲しい このコンストラクター:
public HMACSHA256(byte[] key)
指定されたキーデータを使用して、HMACSHA256クラスの新しいインスタンスを初期化します。
HMACアルゴリズムをハードコードしたくない場合は、使用できます keyedhashalgorithm.create 設定して特定のキーを提供します keyedhashalgorithm.key 財産。
キーを使用したくない場合は、sha256のような鍵のないハッシュを使用してください。
他のヒント
誰かに私が経験した頭痛を救うことを期待してこれに追加するだけです。
の場合 .NETメンバーシッププロバイダー, 、web.configまたはapp.configに設定があることを確認してください。そうでなければ、それは自動的に独自のキーを生成します...認証をがらくたし、最後にあなたを好奇心から笑います。
HMACSHA256にはキーが必要です。キーは、コンストラクターに渡されない場合、ランダムになります。