CSP と暗号化プロセス
CryptoAPI 関数では 、暗号化サービス プロバイダー (CSP) を使用して暗号化と暗号化解除を実行し、キーのストレージとセキュリティを提供します。 これらの CSP は独立したモジュールです。 CSP は、特定のアプリケーションに依存しないように記述するのが理想的です。そのため、すべてのアプリケーションがさまざまな CSP で実行されます。 ただし、実際には、一部のアプリケーションには、カスタマイズされた CSP を必要とする特定の要件があります。 これは、Windows GDI モデルと比較されます。 CSP は、グラフィックス デバイス ドライバーに似ています。
システム内のキーの保護の品質は、システム全体ではなく、CSP の設計パラメーターです。 これにより、アプリケーションは変更なしでさまざまなセキュリティ コンテキストで実行できます。
暗号化内部へのアクセス アプリケーションは慎重に制限されています。 これにより、セキュリティで保護された移植可能なアプリケーション開発が容易になります。
次の 3 つの設計規則が適用されます。
- アプリケーションはキーマテリアルに直接アクセスできません。 すべてのキーマテリアルは CSP 内で生成され、不透明なハンドルを介してアプリケーションによって使用されるため、アプリケーションまたはその関連する DLL がキーマテリアルを漏らしたり、不適切なランダムソースからキーマテリアルを選択したりするリスクはありません。
- アプリケーションでは、暗号化操作の詳細を指定できません。 CSP インターフェイスを使用すると、アプリケーションで暗号化または署名アルゴリズムを選択できますが、すべての暗号化操作の実装は CSP によって行われます。
- アプリケーションでは、ユーザー資格情報やその他のユーザー認証データ は 処理されません。 ユーザー認証は CSP によって行われます。そのため、生体認証入力などの高度な認証機能を備えた将来の CSP は、アプリケーション認証モデルを変更しなくても機能します。
少なくとも、CSP はダイナミック リンク ライブラリ (DLL) と 署名ファイルで構成されます。 署名ファイルは、 CryptoAPI が CSP を確実に認識するために必要です。 CryptoAPI は、この署名を定期的に検証して、CSP に対する改ざんが検出されることを確認します。
一部の CSP は、ローカル RPC を介して呼び出されるアドレス区切りサービスまたはシステム デバイス ドライバーを介して呼び出されるハードウェアで、その機能の一部を実装できます。 アドレス区切りサービスまたはハードウェアでグローバル キー状態と中央暗号化操作を分離すると、アプリケーション データ空間内でのキーと操作の改ざんを防げます。
アプリケーションが特定の CSP に固有の属性を利用するのは賢明ではない。 たとえば、Microsoft Base Cryptographic Provider (CryptoAPI に付属) では、40 ビットのセッション キーと 512 ビットの公開キーがサポートされています。 これらのキーを操作するアプリケーションでは、別の CSP を使用するとアプリケーションが失敗する可能性があるため、これらのキーを格納するために必要なメモリ量に関する想定を避ける必要があります。 適切に記述されたアプリケーションは、さまざまな CSP で動作する必要があります。
CryptoAPI で使用できる暗号化プロバイダーの種類と定義済みの CSP の詳細については、「 暗号化プロバイダーの種類 と Microsoft 暗号化サービス プロバイダー」を参照してください。