アクセスできないようにパスワードをコンピュータに保存する最良の方法は何ですか? それらを暗号化されたレジストリに保存したいと思います。パスワードをリセットできるようにしてほしいのですが、これはサーバー用ではありません。これは、それらをコンピューターに保存して、それらを記憶し、自動的にサインインするためのものです。
重要な編集: プログラム内から平文のパスワードを取得できるようにする必要があります。他の場所からではありません。
アクセスできないようにパスワードをコンピュータに保存する最良の方法は何ですか? それらを暗号化されたレジストリに保存したいと思います。パスワードをリセットできるようにしてほしいのですが、これはサーバー用ではありません。これは、それらをコンピューターに保存して、それらを記憶し、自動的にサインインするためのものです。
重要な編集: プログラム内から平文のパスワードを取得できるようにする必要があります。他の場所からではありません。
CryptProtectDataとCryptUnprotectDataは、Windows での最善の策です。ログイン資格情報を使用してデータを暗号化するため、パスワードはディスクへの攻撃から保護されます。ただし、同じユーザーで実行されているすべてのプログラムからアクセスできます。他のプログラムがアクセスできないようにする権限を持つファイル (アクセスに管理者権限が必要なファイルなど) に保存することをお勧めします。
マネージ クラスProtectedDataはこれらの関数を使用しているため、C# から使用できます。
これらの関数は、P/Invoke を使用して直接使用することもできます。まさにそれを行うコード例がいくつかありますhere。
追加要件に応じた拡張:
プログラムを管理者権限で起動しなくても、自分のプログラムだけがパスワードにアクセスできるようにする方法がありますが、それにはさらに多くの作業が必要です。
基本的な考え方は次のとおりです。アプリケーションのインストール時にインストールされる Windows サービスを作成します。ユーザーのパスワードを保存/取得する必要がある場合は、アプリケーションからオンデマンドで起動する必要があります。このサービスは、管理者のみが読み取り/書き込みできるように、アクセス許可が設定されたファイルへの読み取り/書き込みアクセスを提供するだけです。追加のセキュリティは、 Named Pipeを使用するプロセスへの IPC 接続から得られます。次に、GetNamedPipeClientProcessId (申し訳ありませんが、P/Invoke が必要です) を使用して、パイプに接続されたクライアントのプロセス ID を検索することにより、要求を認証できます。
セキュリティについてどの程度心配しているかにもよりますが、有効な証明書にアクセスできる場合は、コード署名を使用してプロセス ID を確認できます。または、実行可能ファイルのチェックサムまたはその性質のものを確認できます。
これは、Windows で探しているセキュリティを作成するために私が考えることができる唯一の方法です。また、アプリケーションは ProtectedData を使用してデータを暗号化してから、Windows サービスにデータを渡して、ハード ディスク攻撃から保護する必要があります。
私が探しているのはAESだと思います。これは、パスワードを保存する簡単な方法のようです。もちろん、これはコンピュータのパスワードを記憶するためだけのものであるため、ユーザーはパスワードを入力する必要はありません。