C#では、SHA1を自動的に使用する方法は?
SHA1はMD5より優れていますか?(ユーザー名とパスワードにハッシュを使用し、認証に速度が必要です)
自動的に何を意味するのかわかりませんが、実際にはSHA256
以上。また、alwaysソルトを使用 ( code )ハッシュを使用します。サイドノートは、時間が経過した後、強化されたハッシュを使用する方が、単純な速度ベースのハッシュ関数を使用するよりもはるかに優れています。つまり:数百回の繰り返しでのハッシュ、またはbcrypt
などのすでに実証済みのハッシュ関数を使用します(これについては後で説明します)。 .NETでSHA256ハッシュ関数を使用するためのコードサンプルは次のとおりです。
byte[] data = new byte[DATA_SIZE];
byte[] result;
using(SHA256 shaM = new SHA256Managed()) {
result = shaM.ComputeHash(data);
}
SHA256を使用してトリックを実行します [〜#〜] msdn [〜#〜] にあります。
SHA1の「クラッキング」に関する補足: SHA-1のクラッキングをパースペクティブに置く
SHA1はMD5よりも強力なので、選択できる場合は使用することをお勧めします。次に例を示します。
public static string CalculateSHA1(string text, Encoding enc)
{
byte[] buffer = enc.GetBytes(text);
SHA1CryptoServiceProvider cryptoTransformSHA1 = new SHA1CryptoServiceProvider();
return BitConverter.ToString(cryptoTransformSHA1.ComputeHash(buffer)).Replace("-", "");
}
両方とも、少なくとも直接使用するには速すぎます。キーの強化を使用して、パスワードハッシュ手順を「遅く」します。残念ながら、パスワードセキュリティの敵はスピードです。
どれくらい遅いですか?パスワードハッシュを〜マイクロ秒から〜数百ミリ秒に遅くしても、アプリケーションのパフォーマンスに悪影響はありません...しかし、パスワードのクラッキングは文字通り10万倍遅くなります。
詳細については、この記事をご覧ください: http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-Rainbow-tables-what-you-need-to-know-about- s.html
問題は、MD5が高速であることです。 SHA1やSHA256などの最新の競合製品も同様です。ハッシュはほとんどすべての暗号システムの構成要素であり、通常はパケットごとまたはメッセージごとにデマンド実行されるため、速度は現代の安全なハッシュの設計目標です。
速度は、パスワードハッシュ関数では望ましくないものです。
... をちょきちょきと切る ...
パスワード攻撃ゲームは、パスワードXをクラックするのにかかった時間で記録されます。Rainbowテーブルでは、その時間はテーブルの大きさと検索できる速さに依存します。インクリメンタルクラッカーでは、パスワードハッシュ関数をどれだけ速く実行できるかにかかっています。
とはいえ、BCryptを使用してください。 SCryptは最近開発されましたが、安定した(または本番用の)ライブラリがまだ存在しているとは思えません。理論的には、SCryptはBCryptを改善すると主張しています。 「自分でビルドする」ことは推奨されませんが、MD5/SHA1/SHA256を何千回も繰り返すことでトリックを実行する必要があります(つまり、キーの強化)。
そして、あなたがそれらについて知らない場合には、Rainbow Tablesを必ず読んでください。基本的なセキュリティ関連。
byte[] data = new byte[DATA_SIZE];
byte[] result;
SHA1 sha = new SHA1CryptoServiceProvider();
// This is one implementation of the abstract class SHA1.
result = sha.ComputeHash(data);
これらを使いたいです。
MD5、SHA1/256/384/512、オプションのエンコードパラメータ付き。
その他 HashAlgorithms 。Darin Dimitrovに感謝します。
public static string MD5Of(string text)
{
return MD5Of(text, Encoding.Default);
}
public static string MD5Of(string text, Encoding enc)
{
return HashOf<MD5CryptoServiceProvider>(text, enc);
}
public static string SHA1Of(string text)
{
return SHA1Of(text, Encoding.Default);
}
public static string SHA1Of(string text, Encoding enc)
{
return HashOf<SHA1CryptoServiceProvider>(text, enc);
}
public static string SHA384Of(string text)
{
return SHA384Of(text, Encoding.Default);
}
public static string SHA384Of(string text, Encoding enc)
{
return HashOf<SHA384CryptoServiceProvider>(text, enc);
}
public static string SHA512Of(string text)
{
return SHA512Of(text, Encoding.Default);
}
public static string SHA512Of(string text, Encoding enc)
{
return HashOf<SHA512CryptoServiceProvider>(text, enc);
}
public static string SHA256Of(string text)
{
return SHA256Of(text, Encoding.Default);
}
public static string SHA256Of(string text, Encoding enc)
{
return HashOf<SHA256CryptoServiceProvider>(text, enc);
}
public static string HashOf<TP>(string text, Encoding enc)
where TP: HashAlgorithm, new()
{
var buffer = enc.GetBytes(text);
var provider = new TP();
return BitConverter.ToString(provider.ComputeHash(buffer)).Replace("-", "");
}
sHA1またはSHA2を使用するMD5アルゴリズムには問題があります。
http://userpages.umbc.edu/~mabzug1/cs/md5/md5.html http://msdn.Microsoft.com/en-us/library/system.security.cryptography.md5 %28v = vs.85%29.aspx