CSPData Encryption Service提供者(Cryptographic Service Provider)具有一下幾個特點:
- CSP是真正執行密碼運算的獨立模組
- 物理上一個CSP由兩部分組成:一個動態串連庫,一個簽名檔案
- 簽名檔案保證密碼服務提供者經過了認證,以防出現攻擊者冒充CSP
- 若密碼編譯演算法用硬體實現,則CSP還包括硬體裝置
- Microsoft通過捆綁RSA Base Provider,在作業系統中提供一個CSP,使用RSA公司的公開金鑰加密演算法,更多的CSP可以根據需要增加到應用中。
- Windows 2000以後內建了多種不同的CSP
一、CSP服務體系
CSP服務體系分層
CSP服務體系從系統結構,系統調用層次方面來看,分為相互獨立的三層(如:服務分層體系):
1)最底層是Data Encryption Service提供層,即具體的一個CSP,它是Data Encryption Service提供機構提供的獨立模組,擔當真正的資料加密工作,包括使用不同的加密和簽名演算法產生密鑰,交換密鑰、進行資料加密以及產生資料摘要、數字化簽名它是獨立於應用程式層和作業系統,其提供的通用的SPI編程接El與作業系統層進行互動;有些CSP使用特殊硬體一起擔當加密工作,而有些則通過RPC分散其功能,以達到更為安全。
2)中介層,即作業系統(0S)層,在此是指具體的Win9X、NT和2K及更高版本的32位操作平台,在CSP體系中,以及為應用程式層提供統一的API介面,為Data Encryption Service提供層提供SPI介面,作業系統層為應用程式層隔離了底層CSP和具體加密實現細節,使用者可獨立各個CSP進行互動它擔當一定管理功能,包括定期驗證CSP等。
3)應用程式層,也就是任意使用者進程或線程具體通過叫用作業系統層提供的Crypto API使用Data Encryption Service的應用程式。
根據CSP服務分層體系,應用程式不必關心底層CSP的具體實現細節,利用統一的API介面進行編程,而由作業系統通過統一的SPI介面來與具體的Data Encryption Service提供者進行互動,由其他的廠商根據服務編程介面SPI實現加密、簽名演算法,有利於實現數字加密與數位簽章。
應用程式中要實現數字加密與數位簽章時,一般是調用微軟提供的APICrypto API。應用程式不能直接與Data Encryption Service提供者(CSP)通訊,只能通過Crypto API作業系統介面過濾後,經過Crypto SPI系統服務介面與相應的CSP通訊。CSP才是真正實現所有加密操作的獨立模組。
二、CSP組成
CSP為Windows平台上加解密運算的最核心層實現,是真正執行加密工作的獨立的模組。CSP與Windows的介面以DLL形式實現,CSP是真正執行加密工作的獨立模組。
按照CSP的不同實現方法,可分為純軟體實現與帶硬體的實現,其中帶硬體的實現CSP按照硬體晶片不同,可以分為使用智慧卡晶片(內建密碼編譯演算法)的加密型和不使用智慧卡晶片的儲存型兩種,與電腦的介面現在一般都用USB,所以把CSP硬體部分稱為USB Key。
物理上一個CSP由這幾部分組成:動態連結程式庫,簽名檔案,簽名檔案保證提供者經過了認證,作業系統能識別CSP,作業系統可利用其定期驗證CSP,保證其未被篡改。還可以使用輔助的DLL實現CSP,輔助的DLL不是CSP的一部分,但是包含CSP調用的函數,輔助的DLL也必須被簽名,並且簽名檔案必須可用,每個DLL在裝載庫之前被驗證簽名,每個CSP都有一個名字和一個類型。若有硬體實現,則CSP還包括硬體裝置。CSP邏輯上主要由以下部分組成(CSP組成):
(1)微軟提供的SPI介面函數實現。在微軟提供的SPI介面中共有23個基本密碼系統函數由應用程式通過CAPI調用,CSP必須支援這些函數,這些函數提供了基本的功能。
(2)加密簽名演算法實現。如果是純軟體實現的CSP與用儲存型的USB Key實現的CSP,這些函數就在CSP的DLL或輔助DLL中實現,帶硬體裝置實現的CSP,並且用加密型的USB Key,CSP的動態庫就是一個架構,一般的函數實現是在CSP的動態庫中,而主要函數的核心是在硬體中實現,在CSP的動態庫中只是函數的架構,如:加/解密,散列資料,驗證簽名等,這是因為私密金鑰一般不匯出,這些函數的實現主要在硬體裝置中,保密性好。
(3)CSP的密鑰庫及密鑰容器,每一個密碼編譯服務提供者都有一個獨立的密鑰庫,它是一個CSP內部資料庫,此資料庫包含一個和多個分屬於每個獨立使用者的容器,每個容器都用一個獨立的標識符進行標識。不同的密鑰容器記憶體放不同使用者的簽名金鑰組與交換金鑰組以及x.509數位憑證。出於安全性考慮,私密金鑰一般不可以被匯出。帶硬體實現的CSP,CSP的密鑰庫及密鑰容器放在硬體儲存空間中,純軟的CSP實現是放在硬碟上的檔案中。
三、CSP實現
在實現微軟的CSP時採取了如所示:CSP設計架構。通過智能密碼鑰匙專用API實現了微軟CSP。為了相容NetScape瀏覽器等所支援的PKCS#11,在實現PKCS#ll的基礎上,通過調用PKCS#ll介面實現微軟CSP服務編程介面。這樣在其它作業系統平台上實現PKCS時也就方便了很多。
使用者介面擷取PIN
當一個應用要求訪問使用者私密金鑰或其他身份資訊時,必須首先使用使用者身份識別碼(PIN)來認證使用者,:使用者介面擷取PIN。通過了認證的程式允許訪問身份密鑰中的使用者敏感性資料。使用者程式對身份密鑰中使用者敏感性資料的訪問必須在一個事務中完成。事務開始前,身份鑰處於未認狀態;事務結束後,身份密鑰仍然返回未認證狀態。為了避免每一次操作都要求使用者輸入PIN,應該在CSP內部緩衝用PIN。所有關於使用者PIN的顯示和操作都必須從這個緩衝中直接獲得,並且這個緩衝的PIN必須與特定登入使用者和特定使用者身份密鑰同步關聯,一旦登入使用者改變或身份密鑰從主機中取出,就必須清除相應的PIN緩衝。
四、支援的CSP模組函數
中孚智能密碼鑰匙通過提供標準的CSP模組實現了與CryptoAPI應用程式無縫的整合。中孚智能密碼鑰匙的CSP模組是遵從微軟的Crypto Service Provider編程規範編寫,可以相容現在和將來的CryptoAPI應用。次CSP是一個PROV_RSA_FULL類型的CSP,它具有一下特點:
提供了安全RSA金鑰組容器
提供多種分組和Hash演算法
硬體實現RSA運算
支援國產密碼編譯演算法
編寫的個人數位憑證載體
以下所列是中孚智能密碼鑰匙支援的CSP模組函數,這些函數是CSP SPI,CryptoAPI應用程式不用直接調用這些介面,通過微軟的安全體系間接調用。
名稱 |
描述 |
串連函數 |
CPAcquireContext |
為應用程式建立一個上下文 |
CPGetProvParam |
擷取CSP相關資訊 |
CPReleaseContext |
釋放CPAcquireContext擷取的上下文 |
CPGetProvParam |
設定CSP相關參數 |
密鑰產生和交換函數 |
CPDeriveKey |
從一個資料散列中產生一個工作階段金鑰,保證產生的密鑰互不相同 |
CPDestroyKey |
釋放密鑰控制代碼,釋放後密鑰控制代碼無效,密鑰將不能再被訪問 |
CPDuplicateKey |
建立密鑰的拷貝 |
CPExportKey |
從CSP密鑰容器中匯出密鑰 |
CPImportKey |
從一個Blob中匯入密鑰到CSP容器中 |
CPGenKey |
產生密鑰或者金鑰組 |
CPGenRandom |
產生隨機數 |
CPSetKeyParam |
設定密鑰屬性 |
CPGetKeyParam |
擷取密鑰屬性 |
CPGetUserKey |
擷取密鑰容器中持久金鑰組 |
資料加密函數 |
CPEncrypt |
加密明文 |
CPDecrypt |
解密密文 |
散列和數位簽章函數 |
CPCreateHash |
初始化散列對象 |
CPDestroyHash |
刪除散列對象 |
CPDublicateHash |
建立散列對象拷貝 |
CPSetHashParam |
設定散列對象屬性 |
CPGetHashParam |
擷取散列對象屬性 |
CPHashData |
散列輸入資料 |
CPHashSessionKey |
散列一個工作階段金鑰 |
CPSignHash |
簽名一個散列對象 |
CPVerifySignature |
驗證一個散列對象 |
CPAcquireContext函數是所有CSP函數中最先被調用的函數。上層應用通過調用這個函數來指定操作那一個密鑰容器。每個密鑰容器中同時只能儲存一對RSA金鑰組,和任意多個工作階段金鑰。RSA金鑰組是可以持久儲存的對象,而工作階段金鑰只能在運行時候存在。如果應用程式需要存取金鑰容器中的RSA私密金鑰,則中孚智能密鑰鑰匙的CSP將會要求驗證使用者的數字 PIN 碼。將彈出驗證使用者數字 PIN 碼的對話方塊。使用者輸入正確的數字 PIN 碼,驗證正確以後CSP模組將進行後續的操作。