次の方法で共有


キーの保存と取得

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

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 Key Storage Functions」を参照してください。

キーの種類

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\ユーザー SID\
%APPDATA%\Microsoft\Crypto\DSS\ユーザー 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 を使用する必要があります。

CNG キー ストレージ機能

キー ストレージ プロパティ識別子

NCryptFinalizeKey