2017-04-13 11 views
2

ここで長らくlurkerは私が見ていないという質問をしています。私はdotnetコアにc#コンソールアプリケーションを作成しており、ユーザーがパスワードを入力できるようにしようとしており、セキュリティ、特にメモリーダンプを心配しています。C#でパスワード入力をセキュリティで保護するdotnetコアコンソールアプリケーション

次のとおりです。Password masking console application私の理解は、文字列変数として格納されパスワードがメモリダンプreference)を介して公開することができることです。

通常、SecureStringはここに移動する方法ですが、dotnet coreではサポートされていないようです。

私は文字配列を使用するようにコードを修正しようとしました。これは、変更が不変ではないということであり、すべてが単一のメモリに格納されるわけではないからです。正直なところ、セキュリティは私の特権ではありませんが、私の質問は、以下のコードが適切にメモリダンプを通してパスワードを公開しないように保護しているかどうかです。

 Console.WriteLine("Enter pass"); 
     char[] passwordArray = new char[256]; 
     int whileIndex = 0; 

     while (true) 
     { 
      ConsoleKeyInfo key = Console.ReadKey(true); 
      if (key.Key == ConsoleKey.Enter) 
      { 
       break; 
      } 
      else if (key.Key == ConsoleKey.Backspace) 
      { 
       if (whileIndex != 0) //so it doesn't explode if someone holds backspace 
       { 
        whileIndex--; 
       } 
      } 
      else 
      { 
       passwordArray[whileIndex] = key.KeyChar; 
       whileIndex++; 
      } 
     } 
     //Truncate array to length of password 
     var endIndex = Array.IndexOf(passwordArray,'\0'); 
     char[] shortenedPasswordArray = new char[endIndex]; 
     Array.Copy(passwordArray, shortenedPasswordArray, endIndex); 

     //Authentication code here 

     //Wipe the characters when done 
     foreach(var passChar in passwordArray) 
     { 
      passwordArray[passChar] = '\0'; 
     } 

     foreach (var passChar in shortenedPasswordArray) 
     { 
      shortenedPasswordArray[passChar] = '\0'; 
     } 
+0

AFAIKアレイにはまだメモリスペースが割り当てられています –

+0

あなたの脅威モデルは何ですか?誰が何をしていますか? –

+0

@NeilMcGuiganは、そのコンテキストがどのくらい役立つかは不明でした。このアプリケーションの目的は、ADオブジェクトのリストをプルダウンするためにLDAPクエリを実行することです、私は接続をバインドするユーザー/パスを要求しています。個人的には資格情報を保存するよりもリスクを低くする/デバイス間を渡すことはリスクが低いと考えていますが、IT管理者が貴重な資格情報を使って実行する可能性があるため、ここでデューデリジェンスを行いたいと思っています。 – Polymergraphy

答えて

2

いくつかのコメント: 1)まず第一に、セキュリティを1つのアプリケーションで解決されていないことを覚えておいてください。マシンに完全にアクセスできる誰かのために、パスワードを本当に安全に保つために(ほとんど)何もできません。

は(楽しいエクササイズ:?どのようにすべてのメモリにパスワードを維持せずにパスワードを認証します)

2)のみあなたのときにあなたが決めるせることにより、メモリ内のパスワードの寿命をより詳細に制御できますSecureString去る。通常の文字列は、プログラムが終了するまでメモリ内で非常に長い時間続くことがあります。なぜなら、ガベージコレクションまではそれほど離れないからです。 SecureStringを使用すると、明示的に消去できますが、それまではメモリ内にはまだ存在しています。

3)独自のchar配列を使用するのは良い考えですが、可変長でもLinkedListでも可能なので、リストを使用している可能性があります。肩をすくめる。 #1に戻って、パスワードを保護している攻撃の種類を検討してください。

+2

最初の段落はクリンチャーです。攻撃者がプログラムを実行しているマシンに物理的に自由にアクセスできるようにする必要のある脆弱性は、プログラマとして心配する必要はありません。これはコードやデータセキュリティの問題ではありません。それは物理的なセキュリティ問題です。攻撃者がコンピュータのすべてを監視でき、セキュリティを侵害することができないという、いわゆる「ホワイトボックスセキュリティ」という考えは、難しいと知られており、不可能であると信じられています。 – KeithS

+0

この回答とコメントを評価してください。私が心配しているシナリオは、それを救うことができないように侵害されたコンピュータを含むかもしれないと気づいています。セキュリティは私が非常に初心者である大規模な獣であり、ほとんどの場合、ここでコーディングするのと同等の "パスワードポストイットがモニタに固​​執している"ありがとうございました。 – Polymergraphy

+0

私はかつてマイクロソフトで働いていました。彼らにはセキュリティチームの唯一の人々だけがセキュリティに取り組むことを許可されているというポリシーがあります。なぜなら、訓練されていない人が悲惨なバックドアを作成する可能性が非常に高いためです。あなたがフィールドを知らないと悪い気にしないでください。質問するのはとても良いです。 –

0

ユーザーの入力が安全なパスワードハッシングアルゴリズムによって処理された後に、その入力を保存します。ユーザーが再度認証する必要があるときに同じアルゴリズムにアクセス可能にし、その結果を使用してユーザーを検証します。

+0

Windowsはハッシュアルゴリズムの有効性を確認していますが、それでもメモリにハッシュコードが必要なため、これは安全ではありません。 –

+0

はい、そうです。ハッシングアルゴリズムはパラメータを必要とします。これは単にメモリ内の場所を指しています。文字通り、メモリ空間全体が暗号化のレイヤーによって保護されていない限り、アプリケーションのメモリをどのように保護することができないのか正確にはわかりません。 –

+0

あなたは入力を比較するキーファイルを保存することができます。私は本当にあなたがユーザーの入力がメモリに達するのを防ぐ方法を見ていません。私が見る唯一の他の選択肢は、モバイルデバイスに届くいくつかのタイプのオーセンティケーターを使用することです。あるいは、あなたは単にマシンにいくつかのSSHキーを保存することができます。しかし、その時点で、管理者権限を持つ悪質なプログラムやユーザーは、あなたのSSH鍵にアクセスすることになります。これは人事問題であり、ソフトウェアの問題ではありません。 –

関連する問題