獲得Windows密碼服務環境(CSP Context)

      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))
{
... ...
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章