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