[C#] レジストリに保存するときにパスワードを暗号化する最も簡単な方法は何ですか?


Answers

あなたのハッシュを「塩漬け」することも考えてください(料理のコンセプトではありません!)。 基本的には、ハッシュする前にいくつかのランダムなテキストをパスワードに追加することを意味します。

塩分の値は、資格情報ストアが侵害された場合に攻撃者が辞書攻撃を行うのを遅らせるのに役立ちます。これにより、侵入を検知して対応する時間がさらに長くなります。

パスワードハッシュを保存するには:

a)ランダムな塩の値を生成する:

byte[] salt = new byte[32];
System.Security.Cryptography.RNGCryptoServiceProvider.Create().GetBytes(salt);

b)パスワードに塩を付け加えます。

// Convert the plain string pwd into bytes
byte[] plainTextBytes = System.Text UnicodeEncoding.Unicode.GetBytes(plainText);
// Append salt to pwd before hashing
byte[] combinedBytes = new byte[plainTextBytes.Length + salt.Length];
System.Buffer.BlockCopy(plainTextBytes, 0, combinedBytes, 0, plainTextBytes.Length);
System.Buffer.BlockCopy(salt, 0, combinedBytes, plainTextBytes.Length, salt.Length);

c)結合されたパスワードと塩をハッシュする:

// Create hash for the pwd+salt
System.Security.Cryptography.HashAlgorithm hashAlgo = new System.Security.Cryptography.SHA256Managed();
byte[] hash = hashAlgo.ComputeHash(combinedBytes);

d)結果のハッシュに塩を追加する。

// Append the salt to the hash
byte[] hashPlusSalt = new byte[hash.Length + salt.Length];
System.Buffer.BlockCopy(hash, 0, hashPlusSalt, 0, hash.Length);
System.Buffer.BlockCopy(salt, 0, hashPlusSalt, hash.Length, salt.Length);

e)結果をユーザーストアデータベースに格納します。

この方法では、塩を別々に保管しておいてから、salt値とユーザーから取得した平文のパスワード値を使用してハッシュを再計算する必要はありません。

編集 :生のコンピューティングパワーが安くて速くなるにつれて、ハッシングやソルトハッシュの価値が低下しました。 ジェフ・アトウッド氏は2012年の優れたアップデートで、

これは(塩漬けされたハッシュを使用して)実際のセキュリティよりもセキュリティの錯覚を提供します。 ハッシュを生成してハッシュをチェックするには、ソルトとハッシュアルゴリズムの選択の両方が必要であるため、攻撃者はハッシュアルゴリズムを選択することはできません。 攻撃者があなたのパスワードデータベースを持っているという点に侵害されてしまった場合、秘密の秘密の塩を持っている、または入手できると想定するのが合理的です。

セキュリティの第一のルールは、常に最悪の状況を想定して計画することです。 あなたは、各ユーザーのために塩を、理想的にはランダムな塩を使用すべきですか? 確かに、それは間違いなく良い習慣であり、少なくとも同じパスワードを持つ2人のユーザーを明確にすることができます。 しかし、今日では、塩だけではもはやビデオカードハードウェアに数千ドルを費やす人からあなたを救うことはできません。

Question

現在、私はそれを平文で書いています それはインハウスプログラムなので、それほど悪くはありませんが、私はそれを正しくしたいと思います。 レジストリに書き込むときにこれを暗号化する方法と、それをどのように復号化するのですか?

OurKey.SetValue("Password", textBoxPassword.Text);



暗号化/復号化ではなく、ハッシュアルゴリズム、md5 / sha512などを使用してパスワードを渡す必要があります。 理想的には、パスワードをハッシュしてハッシュを格納し、パスワードが必要な場合はエントリをハッシュしてエントリを比較します。 パスワードは決して "解読"されず、単純にハッシュされて比較されます。




アプリケーションで認証に使用されるパスワードの場合は、他のパスワードが示唆するようにパスワードをハッシュします。

外部リソース用のパスワードを保管している場合は、ユーザーにこれらの資格情報を要求し、安全に保存する機会を与えることができます。 Windowsは、この目的のためにCredentials UI(CredUI)を提供しています。これは、 MSDNのこの UIを含め、.NETでの使用方法を示す多数のサンプルがあります。







1つのオプションは、クリアテキストのパスワードの代わりにパスワードのハッシュ(SHA1、MD5)を格納することで、パスワードが良いかどうかを確認したいときは、そのハッシュと比較するだけです。

安全なストレージが必要な場合(たとえば、サービスへの接続に使用するパスワードの場合)、問題はより複雑になります。

認証のためのものであれば、ハッシュを使用すれば十分です。




これ以上のものが必要な場合、たとえば接続文字列(データベースへの接続用)を確保する場合は、このための最良の「オプション」を提供するので、このarticleチェックしてarticle

Oliの答えも良いです。文字列のハッシュを作成する方法を示しています。




Links