キーの保存と取得

キー ストレージのアーキテクチャ

CNG は、公開キーや秘密キーの暗号化などの暗号化機能を使用するアプリケーションを作成する現在および将来の要求と、キーマテリアルのストレージの要求に適応できるようにする秘密キー ストレージのモデルを提供します。 キー ストレージ ルーターは、このモデルの中心的なルーチンであり、Ncrypt.dllに実装されています。 アプリケーションは、キー ストレージ ルーターを介してシステム上のキー ストレージ プロバイダー (KSP) にアクセスします。これにより、アプリケーションとストレージ プロバイダー自体の両方からキーの分離などの詳細が隠されます。 次の図は、CNG キー分離アーキテクチャの設計と機能を示しています。

cng キー ストレージ プロバイダー

一般的な基準 (CC) 要件に準拠するには、有効期間の長いキーを分離して、アプリケーション プロセスに存在しないようにする必要があります。 CNG は現在、Windows Server 2008 および Windows Vista に含まれ、既定でインストールされている Microsoft ソフトウェア KSP を使用して非対称秘密キーのストレージをサポートしています。

Windows Server 2008 および Windows Vista では、キーの分離が既定で有効になっています。 キー分離機能は、これらより前のプラットフォームでは使用できません。 また、サードパーティの CSP はキー分離サービス (LSA プロセス) に読み込まれません。 キー分離サービスには、Microsoft KSP のみが読み込まれます。

LSA プロセスは、パフォーマンスを最大化するためのキー分離プロセスとして使用されます。 秘密キーへのすべてのアクセスは、キー ストレージ ルーターを経由します。これにより、秘密キーを管理および使用するための包括的な一連の機能が公開されます。

CNG は、格納されているキーの公開部分をプライベート部分とは別に格納します。 キー ペアの公開部分は、キー分離サービスにも保持され、ローカル リモート プロシージャ コール (LRPC) を使用してアクセスされます。 キーストレージルーターは、キー分離プロセスを呼び出すときに LRPC を使用します。 秘密キーへのすべてのアクセスは秘密キー ルーターを経由し、CNG によって監査されます。

前述のように、幅広いハードウェア ストレージ デバイスをサポートできます。 いずれの場合も、これらすべてのストレージ デバイスへのインターフェイスは同じです。 これには、さまざまな秘密キー操作を実行する関数と、キーのストレージと管理に関連する関数が含まれています。

CNG には、暗号化キーの作成、格納、および取得に使用される一連の API が用意されています。 これらの API の一覧については、「 CNG キー ストレージ関数」を参照してください。

キーの種類

CNG では、次のキーの種類がサポートされています。

  • 公開キーと秘密キーをDiffie-Hellmanします。
  • デジタル署名アルゴリズム (DSA、FIPS 186-2) の公開キーと秘密キー。
  • RSA (PKCS #1) の公開キーと秘密キー。
  • いくつかのレガシ (CryptoAPI) の公開キーと秘密キー。
  • 楕円曲線暗号化の公開キーと秘密キー。

サポートされているアルゴリズム

CNG では、次の主要なアルゴリズムがサポートされています。

アルゴリズム キー/ハッシュの長さ (ビット)
RSA 512 ~ 16384(64 ビット単位)
DH 512 ~ 16384(64 ビット単位)
DSA 512 ~ 1024(64 ビット単位)
ECDSA P-256、P-384、P-521 (NIST 曲線)
ECDH P-256、P-384、P-521 (NIST 曲線)
MD2 128
MD4 128
MD5 128
SHA-1 160
SHA-256 256
SHA-384 384
SHA-512 512

キー ディレクトリとファイル

Microsoft レガシ CryptoAPI CSP は、次のディレクトリに秘密キーを格納します。

キーの種類 ディレクトリ
ユーザープライベート %APPDATA%\Microsoft\Crypto\RSA\User SID\
%APPDATA%\Microsoft\Crypto\DSS\User SID\
ローカル システムのプライベート %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\S-1-5-18\
%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\DSS\S-1-5-18\
ローカル サービスプライベート %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\S-1-5-19\
%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\DSS\S-1-5-19\
ネットワーク サービスプライベート %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\S-1-5-20\
%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\DSS\S-1-5-20\
共有プライベート %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeys
%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\DSS\MachineKeys

CNG は、次のディレクトリに秘密キーを格納します。

キーの種類 ディレクトリ
ユーザープライベート %APPDATA%\Microsoft\Crypto\Keys
ローカル システムのプライベート %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\SystemKeys
ローカル サービスプライベート %WINDIR%\ServiceProfiles\LocalService
ネットワーク サービスプライベート %WINDIR%\ServiceProfiles\NetworkService
共有プライベート %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\Keys

CryptoAPI キー コンテナーと CNG キー コンテナーの違いの一部を次に示します。

  • CNG では、Rsaenh.dllおよび Dssenh.dll レガシ CSP によって作成されたキー ファイルとは異なるファイル名がキー ファイルに使用されます。 レガシ キー ファイルにも .key 拡張子がありますが、CNG キー ファイルには .key 拡張子がありません。
  • CNG は Unicode キー コンテナー名を完全にサポートしています。CNG では Unicode コンテナー名のハッシュが使用されますが、CryptoAPI では ANSI コンテナー名のハッシュが使用されます。
  • CNG は、RSA キー ペアに関してより柔軟です。 たとえば、CNG は 32 ビットを超える長さのパブリック指数をサポートし、p と q の長さが異なるキーをサポートします。
  • CryptoAPI では、キー コンテナー ファイルは、ユーザーの SID に相当するテキスト形式の名前を持つディレクトリに格納されます。 これは CNG では当てはまらなくなり、すべての秘密キーを失うことなく、あるドメインから別のドメインにユーザーを移動する難しさを取り除きます。
  • CNG KSP とキー名は、 MAX_PATH Unicode 文字に制限されています。 CryptoAPI CSP とキー名は、 MAX_PATH ANSI 文字に制限されています。
  • CNG には、ユーザー定義キー プロパティの機能が用意されています。 ユーザーは、カスタム プロパティを作成してキーに関連付け、永続化されたキーと共に格納できます。

キーを永続化する場合、CNG は 2 つのファイルを作成できます。 最初のファイルには、新しい CNG 形式の秘密キーが含まれており、常に作成されます。 このファイルは、従来の CryptoAPI CSP では使用できません。 2 番目のファイルには、レガシ CryptoAPI キー コンテナーに同じ秘密キーが含まれています。 2 番目のファイルは、Rsaenh.dllで使用される形式と場所に準拠しています。 2 番目のファイルの作成は、RSA キーを最終処理するために NCryptFinalizeKey 関数が呼び出されたときに、NCRYPT_WRITE_KEY_TO_LEGACY_STORE_FLAG フラグが指定されている場合にのみ発生します。 この機能は、DSA キーと DH キーではサポートされていません。

アプリケーションが既存の永続化されたキーを開こうとすると、CNG は最初にネイティブ CNG ファイルを開こうとします。 このファイルが存在しない場合、CNG はレガシ CryptoAPI キー コンテナー内で一致するキーの検索を試みます。

Windows ユーザー状態移行ツール (USMT) を使用してソース コンピューターからターゲット コンピューターに CryptoAPI キーを移動またはコピーすると、CNG はターゲット コンピューター上のキーにアクセスできません。 このような移行されたキーにアクセスするには、CryptoAPI を使用する必要があります。