25

したがって、めったに使用されないように見えるこのクラスがあります:SecureString。少なくとも2.0から出回っていて、いくつかのSOの質問がありますが、私は自分自身の特定の質問をしたいと思いました。

LoginFormがあります。ユーザー名と(マスクされた)パスワードフィールドを含む単純なWinFormsダイアログ。ユーザーが両方を入力して[ログイン]をクリックすると、情報はキーストレッチのレイヤーを実行する挿入された認証クラスに渡され、検証のためにストレッチされたキーの半分をハッシュし、残りの半分は暗号化されたユーザーの対称キーですアカウントデータ。これがすべて完了すると、loginFormが閉じられ、オーセンティケータークラスが破棄され、システムはメインフォームのロードに進みます。かなり標準的なもので、標準のパスワードと比較のハッシュよりも少し複雑かもしれませんが、私の場合、単純なハッシュパスワードは、ユーザーデータをプレーンテキストで保存することで無効になります。これは、そのデータに3分の1の資格情報が含まれているためです。パーティーシステム(そして私たちは皆、人々がパスワードを再利用する方法を知っています)。

これが最初の質問です。SecureStringを使用して、テキストボックスのTextプロパティを介して通常のSystem.Stringとして公開せずに、Passwordテキストボックスからパスワードを取得するにはどうすればよいですか?CLRクラスによってラップされているテキストボックスのアンマネージGDIウィンドウにアクセスし、Marshalクラスを使用してテキストデータをプルする方法があると思います。方法がわからず、良い情報が見つからないようです。

これが2番目の質問です。SecureStringとしてパスワードを取得したら、System.Security.Crypto名前空間からハッシュプロバイダーにパスワードを渡すにはどうすればよいですか?私の推測では、Marshal.SecureStringToBSTR()を使用してから、返されたIntPtrからバイト配列に戻るMarshal.Copy()を使用します。次に、Marshal.ZeroBSTR()を呼び出してアンマネージメモリをクリーンアップし、ハッシュを取得したらArray.Clear()を使用してマネージ配列をゼロにすることができます。メモリの管理されたコピーの存続期間を完全に制御できるよりクリーンな方法がある場合は、教えてください。

3番目の質問; これは本当に必要なことですか、それともマネージドメモリ環境でのSystem.Stringの固有の不安定さは少し誇張されていますか?暗号化されているかどうかにかかわらず、パスワードの保存に使用されるものすべて範囲外であり、OSがアプリを仮想メモリにスワップすることを検討するずっと前にガベージコレクターに向かう必要があります(パスワードをスワップファイルからスニッフィングできるようにするコンピュータのハードシャットダウン)。コールドブート攻撃は理論的な可能性ですが、実際、これはどのくらい一般的ですか?より大きな懸念は、現在復号化されているユーザーデータです。これは、アプリケーションの存続期間全体にわたってユーザーの一部として存在します(したがって、いくつかの基本的な使用法を除いて、SecureStringsを使用するための主要な候補となります)。

4

2 に答える 2

11

SecureString必要だと思われる場合は、攻撃者がプロセスメモリも読み取ることができると信じる必要があります。後者が当てはまる場合、入力時にパスワード文字を読み取るか、テキストボックスの内部文字バッファーから直接読み取るか、画面からピクセルを読み取ることができます。

これは非現実的なシナリオです。使用しないでくださいSecureString。それはほとんど役に立たず、あなたの時間を盗みます。

コールドブート攻撃はより現実的ですが、非常にまれです。それらは、通常完全にマシンを所有する物理的なマシンアクセスを必要とします。この場合、攻撃者による読み取りは最も懸念事項ではありません。

基本的に、開発者の時間が。を使用して十分に費やされている場合を考え出す必要がありますSecureString

于 2013-01-22T00:36:05.143 に答える
4

まず第一に、私はusrに同意することを述べたいと思います-気にしないでください。

ここで詳細に:

  • この回答は、議論の素晴らしい背景を提供します。
  • これは、SecureStringを利用するTextBoxコントロールです。私はこれを使ったことがないので品質についてコメントすることはできませんが、MSブログに載っているので、それが適切であるとは思っていません。
  • System.Security.Cryptoにデータを渡すことに関する質問に答えるには、基本的にはできません。このようなマーシャリングのプロセス中に文字列が復号化されるため、アンマネージメモリマーシャリングの量は役に立ちません。そうしないと、ターゲットAPIで使用できないためです。CSPまたはX509Certificateを使用している場合、これらはフレームワークでサポートされているため、SecureSctringを使用できますが、それだけです。
于 2013-01-22T00:50:30.580 に答える