8

私はセキュリティについてほとんど知らず(基本の基本的な説明を見つける必要があります)、.Netを使用してデータベースにユーザーパスワードを保存するための合理的な方法を考え出そうとしています。

これが私の現在の解決策です:

private static byte[] HashPassword(string password)
{
   using (var deriveBytes = new Rfc2898DeriveBytes(password, 10))
   {
      byte[] salt = deriveBytes.Salt;
      byte[] key  = deriveBytes.GetBytes(20);

      return salt.Concat(key).ToArray();  //Return Salt+Key
   }
}

HashPassword()の結果をデータベースに保存します。ユーザーのパスワードを確認するには、次のようにします。

var salt = //1st  10 bytes stored in the DB
var key  = //Next 20 bytes stored in the DB 
using (var deriveBytes = new Rfc2898DeriveBytes(password, salt))
{
   byte[] newKey = deriveBytes.GetBytes(20);

   if (newKey.SequenceEqual(key) == false)  //Check if keys match
   {
      return "No Match";
   }
   else { return "Passwords match"; }

私の質問は、ソルトをランダムにしてこのようにDBに保存する必要があるのか​​、それとも10バイトのソルトを生成してコードに保存し、常に同じソルトを使用してソルトをDBに保存するのを節約できるのかということです。キーを保存しますか?

また、私がしていることに他の問題があれば、アドバイスをいただければ幸いです。

4

2 に答える 2

29

私の質問は、ソルトをランダムにしてこのようにDBに保存する必要があるのか​​、それとも10バイトのソルトを生成してコードに保存し、常に同じソルトを使用してソルトをDBに保存するのを節約できるのかということです。キーを保存しますか?

絶対違う。

あなたがその質問をしているのなら、あなたは塩の目的を全く理解していません。

ソルトの目的は、攻撃者がハッシュ化された共通パスワードの事前計算されたテーブルを使用することを任意に困難にすることです。ソルトが常に同じである場合、攻撃者はハッシュされた共通パスワードのテーブルをそのソルトで事前計算するだけです。

それをもっとはっきりさせておきましょう。攻撃者があなたのパスワードデータベースを取得し、ハッシュに対応するパスワードが何であるかを解明するために、保存されているすべてのハッシュに対して自由に攻撃を仕掛けているとします。すべてのソルトが異なる場合、攻撃者はデータベース内のすべてのエントリに対して新たな攻撃を仕掛ける必要があります。すべてのソルトが同じである場合、1人のユーザーを攻撃するとすべてのユーザーが攻撃されます

さらに、すべてのユーザーに同じソルトを使用するとします。2人のユーザーが同じパスワードを持っているとします。そして、攻撃者がパスワードデータベースを取得したとします。攻撃者は、同じソルトハッシュを使用しているため、どの2人のユーザーが同じパスワードを使用しているかを認識し、これがデータベースで最も弱いパスワードであると合理的に推測できます。攻撃者は、特にそのユーザーを攻撃することに(それらが何であれ)彼女の努力を集中させることができます。そして、彼女がそのユーザーのパスワードを知ったら、ユーザーが他のシステムでそのユーザー名と弱いパスワードを使用した可能性が高く、攻撃者はパスワードファイルがなくても侵害できるようになります。

セキュリティについて学びたいのは良いことです。あなたがあなたのレベルの理解で本当のパスワードシステムを書き込もうとしているのは悪いことです。これが実際のユーザーを保護する必要のある実際のシステムの場合は、専門家によって構築されたシステムを使用する、独自の専門家を雇ってください攻撃者が破壊できないシステムではなく、破壊できないシステムを作成します

さらに、あなたはインターネット上の見知らぬ人にセキュリティの助けを求めています。あなたが彼らが何について話しているのかを知っているのか、それともただ物事を作り上げているのかわからない見知らぬ人。本当のセキュリティの専門家を雇ってください(そしてそれは私ではありません-私はセマンティックアナライザーの専門家です)。セキュリティシステムの構築は、最も難しいプログラミングタスクの1つです。あなたは専門家の助けが必要です。

基本的なパスワード認証スキームの簡単な紹介については、私の一連の記事を参照してください。

http://blogs.msdn.com/b/ericlippert/archive/tags/salt/

于 2012-02-08T15:10:31.737 に答える
1

ランダムなソルトを適用する必要はありませんが、適用すると、パスワードの安全性が少し高まります。明らかに、ランダムソルトを適用する場合は、ハッシュされたパスワードとともにデータベースに保存して、提供されたパスワードと照合できるようにする必要があります。

簡単なグーグルがこの投稿を明らかにしました、それはあなたを助けるかもしれません。

于 2012-02-08T14:58:35.273 に答える