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