CSP基礎-CSP入門簡介
CSP加密服務提供者(Cryptographic Service Provider)具有一下幾個特點:
- CSP是真正執行密碼運算的獨立模組
- 物理上一個CSP由兩部分組成:一個動態連線庫,一個簽名檔案
- 簽名檔案保證密碼服務提供者經過了認證,以防出現攻擊者冒充CSP
- 若加密演算法用硬體實現,則CSP還包括硬體裝置
- Microsoft通過捆綁RSA Base Provider,在作業系統中提供一個CSP,使用RSA公司的公鑰加密演算法,更多的CSP可以根據需要增加到應用中。
- Windows 2000以後自帶了多種不同的CSP
一、CSP服務體系
CSP服務體系分層
CSP服務體系從系統結構,系統呼叫層次方面來看,分為相互獨立的三層(如上圖:服務分層體系):
1)最底層是加密服務提供層,即具體的一個CSP,它是加密服務提供機構提供的獨立模組,擔當真正的資料加密工作,包括使用不同的加密和簽名演算法產生金鑰,交換金鑰、進行資料加密以及產生資料摘要、數字化簽名它是獨立於應用層和作業系統,其提供的通用的SPI程式設計接El與作業系統層進行互動;有些CSP使用特殊硬體一起擔當加密工作,而有些則通過RPC分散其功能,以達到更為安全。
2)中間層,即作業系統(0S)層,在此是指具體的Win9X、NT和2K及更高版本的32位操作平臺,在CSP體系中,以及為應用層提供統一的API介面,為加密服務提供層提供SPI介面,作業系統層為應用層隔離了底層CSP和具體加密實現細節,使用者可獨立各個CSP進行互動它擔當一定管理功能,包括定期驗證CSP等。
3)應用層,也就是任意使用者程序或執行緒具體通過呼叫作業系統層提供的Crypto API使用加密服務的應用程式。
根據CSP服務分層體系,應用程式不必關心底層CSP的具體實現細節,利用統一的API介面進行程式設計,而由作業系統通過統一的SPI介面來與具體的加密服務提供者進行互動,由其他的廠商根據服務程式設計介面SPI實現加密、簽名演算法,有利於實現數字加密與數字簽名。
應用程式中要實現數字加密與數字簽名時,一般是呼叫微軟提供的應用程式程式設計介面Crypto API。應用程式不能直接與加密服務提供者(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模組將進行後續的操作。