ユーザー名とパスワードを受け取り、構造体に保存します。
誰かが私のプロセスのメモリを表示したり、ユーザーのユーザー名/パスワードを表示したりできないようにするにはどうすればよいですか?
私の最初のアイデアは、メモリ内のユーザー名とパスワードを暗号化し、使い終わったらゼロにすることでした。しかし、その場合、取得できるキーをメモリのどこかに保存する必要があります。
それは資格情報の回復を非常に困難にしますが、それでも可能です。
これより安全な方法はありますか?
データ保護 APIをご覧ください。これは、まさにこの種のシナリオで Windows コンポーネントとサードパーティ ソフトウェアによって使用され、基本的に暗号化とキー管理を処理します。
キーは現在のユーザーのパスワードに関連付けられていますが、「オプションのエントロピー」を提供できます。これは、サービス資格情報を保護するためにユーザーが入力したパスワードから派生するなど、追加のキー マテリアルの操作ごとのソースとなります。
「これより安全な方法はありますか」については、防御しようとしている脅威のレベルを正確に定義する必要があると思います。同じマシン上の他の(管理者以外の)ユーザーの場合、DPAPIはおそらく完全に問題なく、平文を安全にゼロにするなど、すでに言及したこともあります。同じログイン セッションで実行されている悪意のあるソフトウェアの場合、ほとんど役に立ちません。
最も簡単な解決策は、パスワードをメモリ内に分散させることです。文字列として保存しないでください。バイト変数のセットを宣言し、それらの間にパスワードを分散させます。これによってパスワードが取得できなくなるわけではありませんが、困難になります...攻撃者は、パスワードのビットが保存されている方法と場所を見つけるために、コンピューターとソースの両方にアクセスする(またはバイナリをリバースエンジニアリングする)必要があります。
攻撃者がシステムとソースにアクセスできる場合、またはバイナリを元に戻すことができる場合は、攻撃者にパスワードを電子メールで送信することもできます。
シナリオでのより可能性の高い迎え角は、メモリからパスワードを組み立てようとするよりも、サービスに渡される行為でパスワードを取得することです。
編集:パスワードの収集の難易度を大幅に高めたい場合は、動的メモリ割り当てを使用して、ビットがメモリ内で固定された場所を持たないようにすることもできます。しかし、正直なところ、それはやり過ぎです...パスワードをサービスに渡すときに、攻撃者がパスワードを盗むのも同じくらい簡単です。
優れた機能(SHA1 / 2など)でパスワードをハッシュし、ダイジェストを保存します。保存されているパスワードと照合する場合は、入力をハッシュして、保存されているパスワードと結果を比較します。
暗号化ハッシュ関数の基本的な特性は、一方向性関数であるということです。逆関数を計算するのは非常に困難です。これが、これらの関数があなたのような状況で使用される理由です。