レジストリに保存するときにパスワードを暗号化する最も簡単な方法は何ですか? [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年の優れたアップデートで、

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

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

Question

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

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



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

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

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







Tom Scottは、Computerphileにパスワードを保存する方法を説明しています。

https://www.youtube.com/watch?v=8ZtInClXe1Q

  1. あなたがそれを避けることができるのであれば、自分でパスワードを保管しないでください。 代わりに、事前に確立された信頼できるユーザー認証プラットフォーム(OAuthプロバイダ、会社のActive Directoryドメインなど)を使用します。

  2. パスワードを保存する必要がある場合は、ここのガイダンスに従わないでください。 少なくとも、あなたの選択した言語に適用可能な、最近の評判の良い出版物に相談することはありません。

確かにここには多くのスマートな人々がいて、おそらくいくつかの良い指針が与えられています。 しかし、あなたがこれを読んだときには、ここの答え(これを含む)のすべてがすでに時代遅れになっている可能性が高いというオッズは強いです。

パスワードを保存する正しい方法は、時間とともに変化します。

おそらくいくつかの人々は下着を変更するよりも頻繁に。

すべてのことが言っている、ここにいくつかの一般的な指針は、しばらくの間、有用なままになります。

  1. パスワードを暗号化しないでください。 保存されたデータを復元することができる保存方法は、パスワードを保持する目的では本質的に安全ではありません。
  2. 作成プロセス中にユーザーが入力したパスワードを正確に処理します。 暗号モジュールに送る前にパスワードに行うことは、おそらくそれを弱めるだけです。 次のいずれかを実行するだけで、パスワードの保存と検証プロセスが複雑になり、他の問題(おそらく脆弱性が導入される可能性もあります)が発生する可能性があります。

    • 大文字/全小文字に変換しないでください。
    • 空白を削除しないでください。
    • 容認できない文字や文字列を取り除かないでください。
    • テキストエンコーディングを変更しないでください。
    • 文字や文字列の置換は行わないでください。
    • 任意の長さのパスワードを切り捨てないでください。
  3. 変更せずに保存できないパスワードの作成を拒否します。 上記を補強する。 何らかの理由でパスワード記憶機構が特定の文字、空白、文字列、またはパスワードの長さを適切に処理できない場合は、エラーを返し、ユーザーにシステムの制限を知らせるようにして、それらのパスワードに適合するパスワードで再試行できます。 ユーザーエクスペリエンスを向上させるには、ユーザーがアクセス可能な制限事項のリストを作成してください。 心配することもなく、気にせずに、攻撃者からリストを隠すことも - 彼らはそれだけで十分に簡単にそれを把握するでしょう。

  4. 各口座には、長くてランダムでユニークな塩を使います。 パスワードが実際に同一であっても、2つのアカウントのパスワードはストレージ内で同じに見えるはずはありません。
  5. 低速で暗号的に強力なハッシュアルゴリズムを使用し、パスワード用に設計されています。 MD5は確かに外です。 SHA-1 / SHA-2は使用不可です。 しかし、私はあなたここで使うべきものをあなたに教えるつもりはありません。 (この記事の最初の#2の箇条書きを参照してください。)
  6. あなたが許す限り反復してください。 あなたのシステムは、ハッシュパスワードよりもプロセッササイクルの方が良いことがありますが、パスワードを解読しようとする人は、システムにはないものがあります。 できるだけ厳しいものにしましょう。それは、あなたに「あまりにも難しい」ものではありません。

最も重要なこと...

誰にでも聞いてはいけません。

選択した言語の適切なパスワード保存方法について、評判の良い最新の出版物を検索してください。 実際には、1つの方法で解決する前に、複数の別々の情報源から複数の最新の出版物が合意に達しているはずです。

ここにいるすべての人が言っていることは、既に優れた技術に取って代わられているか、新しく開発された攻撃方法では安全でない可能性が非常に高いです。 おそらくそうでないものを見つけてください。




これ以上のものが必要な場合、たとえば接続文字列(データベースへの接続用)を確保する場合は、この記事を参照してください。

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




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