Windows密碼功能是由各種密碼服務提供程序(CSP)所實現的,應用程序通過調用Windows API中的加密服務API(CryptoAPI)使用CSP所提供的加密/數字簽名等密碼服務。密碼操作涉及用戶密鑰、加密算法代碼等需要特別保護的資源,爲此,Windows系統定義了一個安全的密碼操作環境,即Cryptographic Service Provider Context。在應用程序中,代表此操作環境的是一個CSP句柄。
用CryptAcquireContext函數獲取CSP句柄,是使用CryptoAPI的應用程序第一個CryptoAPI調用。返回的CSP句柄明確了使用CSP中的哪個密鑰容器。該密鑰容器要麼是明確指定的,要麼是當前登錄用戶的缺省密鑰容器,必要時CryptAcquireContext可以創建一個新的密鑰容器。.
加密服務提供程序(CSP)有名字和類型。例如,系統內置的加密服務提供程序Microsoft Base Cryptographic Provider是一個PROV_RSA_FULL類型的提供程序。每個CSP的名字是唯一的,而類型則不唯一。
調用CryptAcquireContext來獲取CSP句柄時,需要根據所要進行的密碼操作指定需要使用的CSP類型,CSP的名稱則是可選的。如果兩者都被指定,函數會按照所指定的名稱和類型加載CSP。應用程序通過返回的CSP句柄及其中指定的密鑰容器使用CSP提供的密碼服務。如果僅指定了CSP類型,函數會先從登錄用戶的CSP列表、然後是計算機的CSP列表中查找一個類型符合的CSP名稱,然後加載對應的CSP,返回其句柄。
CSP句柄使用完畢後,應使用CryptReleaseContext函數釋放相關資源。
相關代碼片段:
// 聲明CSP句柄變量.
HCRYPTPROV hCryptProv;
// 獲得缺省的PROV_RSA_FULL類型CSP的句柄.
if(CryptAcquireContext(
&hCryptProv,
NULL,
NULL, //使用缺省密鑰容器
PROV_RSA_FULL,
0))
{
.......
}
// 如無缺省密鑰容器,試圖創建之。.
if(CryptAcquireContext(
&hCryptProv,
NULL,
NULL, //使用缺省密鑰容器
PROV_RSA_FULL,
CRYPT_NEWKEYSET)) //創建密鑰容器
{
........
}
... ...
//用hCryptProv使用CSP提供的加密/散列/數字簽名等密碼服務。
... ...
... ...
// 密碼服務使用完畢,釋放CSP句柄所關聯的密碼操作環境。.
if (CryptReleaseContext(hCryptProv, 0))
{
... ...
}