共用方式為


金鑰儲存和擷取

金鑰儲存架構

CNG 提供私密金鑰儲存體的模型,可讓您適應目前和未來建立使用密碼編譯功能的應用程式需求,例如公開金鑰或私密金鑰加密,以及儲存金鑰資料的需求。 金鑰儲存路由器是此模型中的中央常式,且會在Ncrypt.dll中實作。 應用程式會透過金鑰儲存路由器存取系統上 (KSP) 金鑰儲存提供者,這會隱藏應用程式和儲存體提供者本身的詳細資料,例如金鑰隔離。 下圖顯示 CNG 金鑰隔離架構的設計和功能。

cng 金鑰儲存提供者

為了符合 CC) 需求 (通用準則,必須隔離長期金鑰,使其永遠不會出現在應用程式程式中。 CNG 目前支援使用隨附于 Windows Server 2008 和 Windows Vista 的 Microsoft 軟體 KSP 來儲存非對稱私密金鑰,並預設安裝。

Windows Server 2008 和 Windows Vista 預設會啟用金鑰隔離。 在上述情況下,無法在平臺上使用金鑰隔離功能。 此外,協力廠商 KSP 不會載入金鑰隔離服務 (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 會將私密金鑰儲存在下列目錄中。

金鑰類型 Directory
使用者私人 %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 容器名稱的雜湊。
  • 對於 RSA 金鑰組而言,CNG 更具彈性。 例如,CNG 支援長度大於 32 位的公用指數,並支援 p 和 q 不同長度的索引鍵。
  • 在 CryptoAPI 中,金鑰容器檔案會儲存在名稱為使用者 SID 的文字對等目錄中。 這不再是 CNG 的情況,這會移除將使用者從一個網域移至另一個網域的困難,而不會遺失其所有私密金鑰。
  • CNG KSP 和金鑰名稱僅限於 MAX_PATH Unicode 字元。 CryptoAPI CSP 和金鑰名稱僅限於 MAX_PATH ANSI 字元。
  • CNG 提供使用者定義索引鍵屬性的功能。 使用者可以建立自訂屬性,並將其與索引鍵建立關聯,並將它們儲存在保存的索引鍵中。

保存金鑰時,CNG 可以建立兩個檔案。 第一個檔案包含新 CNG 格式的私密金鑰,而且一律會建立。 舊版 CryptoAPI CSP 無法使用此檔案。 第二個檔案包含舊版 CryptoAPI 金鑰容器中的相同私密金鑰。 第二個檔案符合Rsaenh.dll所使用的格式和位置。 只有在呼叫NCryptFinalizeKey函式來完成 RSA 金鑰時,才會指定NCRYPT_WRITE_KEY_TO_LEGACY_STORE_FLAG旗標時,才會建立第二個檔案。 DSA 和 DH 金鑰不支援此功能。

當應用程式嘗試開啟現有的保存金鑰時,CNG 會先嘗試開啟原生 CNG 檔案。 如果此檔案不存在,CNG 會嘗試在舊版 CryptoAPI 金鑰容器中找出相符的金鑰。

當您將 CryptoAPI 金鑰從來源電腦移至具有 Windows 使用者狀態移轉工具的目的電腦 (USMT) 時,CNG 將無法存取目的電腦上的金鑰。 若要存取這類遷移的金鑰,您必須使用 CryptoAPI。