2012-01-19 3 views
0

私はHMACSHA1クラスを使用しているのを見て、一部のC#セキュリティコードで作業していました。このコードは、データベースに格納するためにパスワードをハッシュするために使用されます。私の目を引っ張ったのは、ハッシュを計算しているものであるHMACキーとしてパスワードを使用するということでした。それでは、鍵とハッシュの両方にデータを使用していますか?これはセキュリティをより強くするか弱くするか?HMAC SHA1がキーとメッセージに同じ値を使用しています

擬似コード:

string pwd = "[email protected]#123$"; 

using (HMACSHA1 hasher = new HMACSHA1()) 
{ 
    hasher.Key = encoding.GetBytes(pwd); // using password for the key 
    return BytesToHex(hasher.ComputeHash(encoding.GetBytes(pwd))); // computing the hash for the password 
} 

答えて

3

これは、2回の反復と無塩SHA1ハッシュと同じくらい強いです。すなわちかなり弱い。

塩が不足していると、虹のテーブルを作成する攻撃が可能になります。またはデータベース内のすべてのパスワードハッシュを同時に攻撃することもできます。

反復回数が少ないと、攻撃者は簡単に多くのパスワード候補を試すことができるため、攻撃は高速になります。

ソルトを追加し、PBKDF2やbcryptなどのハッシング方法を使用する必要があります。 .netクラスRfc2898DeriveBytesはPBKDF2を実装していますので、私はそれを使用することをお勧めします。

1

HMACSHA1はデータベースのパスワード保存にはお勧めできませんが、Keyとパスワードを同じにすることは、この目的でKeyの有用性を弱めることになります。キーは秘密であると考えられ、基になるハッシュデータが変更されたかどうかを判断するために使用されます。

ハッシュアルゴリズムのセキュリティを強化するには、SALT +パスワードの組み合わせを使用する必要があります。私は通常、ユーザに固有のSALTを使用しますが、ユーザ番号や初期登録IPアドレスなどのパスワードとは異なります。

また、SHA1はハッシュアルゴリズムとして推奨されなくなりました。

よりわかりやすいようにMSDNを参照できます。

このプロパティは、キー付きハッシュアルゴリズムのキーです。

ハッシュベースのメッセージ認証コード(HMAC)は、安全でないチャネルを介して送信されたメッセージが改ざん をされているかどうかを決定 に使用することができる送信者と受信者と共有する秘密鍵 ことを条件とします。送信者は元のデータのハッシュ値を計算し、 は元のデータとHMACの両方を単一のメッセージとして送信します。 受信者は受信メッセージのハッシュ値を再計算し、計算されたハッシュ値が送信されたハッシュ値と一致することを にチェックします。

HMACは、MD5またはSHA-1としての などの任意の反復暗号ハッシュ関数とともに、秘密の共有鍵と組み合わせて使用​​できます。 HMACの暗号強度は、基礎となるハッシュ関数のプロパティに依存します。

メッセージ を変更して正しいハッシュ値を再現するために、秘密鍵の知識が必要であるため、データまたはハッシュ値を変更すると、一致しないという結果になります( )。したがって、元の値と の計算されたハッシュ値が一致する場合、メッセージは認証されます。

関連する問題