パスワードの処理

ユーザー名とパスワードの資格情報は、証明書、生体認証、パスキーなどのより強力な方法が普及している場合でも、認証に一般的なままです。 暗号化キーやその他のシークレットにも保護が必要です。 ソフトウェア システムでは、資格情報の盗難、リプレイ攻撃、攻撃者による横移動を防ぐには、これらの資格情報を安全に処理する必要があります。

Warning

パスワード、API キー、接続文字列、またはその他のシークレットをソース コードにハードコーディングしないでください。 ハードコーディングされたシークレットは、逆コンパイル、メモリ検査、またはソース コード リークを使用して攻撃者によって簡単に抽出されます。 これは、野生で悪用された最も一般的な資格情報の脆弱性の 1 つです。

Important

メモリ内のパスワードまたはシークレットの使用が完了したら、 SecureZeroMemory を呼び出してすぐにバッファーを上書きします。 memsetとは異なり、コンパイラはSecureZeroMemoryを最適化できないため、シークレットが実際にクリアされます。

最新の資格情報管理

Windowsの新しい開発では、次の方法を優先順に使用します。

  1. 可能な限りパスワードを削除します。 パスワードを完全に処理しないようにするには、Windows Hello、パスキー (FIDO2/WebAuthn)、または証明書ベースの認証を使用します。
  2. Windows資格情報マネージャーを使用します。 CredWriteCredRead を呼び出して、OS 資格情報コンテナーに資格情報を格納および取得し、ユーザーのログオン セッション キーで暗号化します。
  3. ローカル シークレット ストレージには DPAPI を使用します。 ローカルに永続化する必要があるシークレットを暗号化するには、 CryptProtectData を呼び出します。 DPAPI は暗号化をユーザー アカウントまたはマシンに関連付け、多層防御を提供します。
  4. サービスの資格情報には、マネージド ID または Key Vault を使用してください。 Azureで実行されているサービスでは、マネージド ID を使用する必要があります。 オンプレミス サービスでは、構成ファイルに格納するのではなく、実行時にセキュリティで保護されたコンテナーからシークレットを取得する必要があります。

パスワード処理の原則

コードでパスワードを処理する必要がある場合:

  • できるだけ遅くパスワードを収集し、できるだけ早く破棄します。 シークレットがメモリ内に存在するウィンドウを最小限に抑えます。
  • パスワードやシークレットをログに記録しないでください。 診断ログ、イベント ログ、およびクラッシュ ダンプに資格情報マテリアルが含まれていないことを確認します。
  • プレーンテキストでパスワードを送信しないでください。 TLS/HTTPS または同等の暗号化チャネルを常に使用します。
  • 安全にプロンプトを表示します。 CredUIPromptForWindowsCredentials を使用して、セキュリティで保護されたデスクトップ分離を適用する標準のWindows資格情報ダイアログを使用して資格情報を収集します。

脅威と軽減策の詳細については、以下を参照してください。