CSP加密服務提供者(Cryptographic Service Provider)具備一下幾個特色:html
- CSP是真正執行密碼運算的獨立模塊
- 物理上一個CSP由兩部分組成:一個動態鏈接庫,一個簽名文件
- 簽名文件保證密碼服務提供者通過了認證,以防出現攻擊者冒充CSP
- 若加密算法用硬件實現,則CSP還包括硬件裝置
- Microsoft經過捆綁RSA Base Provider,在操做系統中提供一個CSP,使用RSA公司的公鑰加密算法,更多的CSP能夠根據須要增長到應用中。
- Windows 2000之後自帶了多種不一樣的CSP
1、CSP服務體系mysql
CSP服務體系分層算法
CSP服務體系從系統結構,系統調用層次方面來看,分爲相互獨立的三層(如上圖:服務分層體系):sql
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纔是真正實現全部加密操做的獨立模塊。安全
2、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實現是放在硬盤上的文件中。
3、CSP實現
在實現微軟的CSP時採起了如上圖所示:CSP設計框架。經過智能密碼鑰匙專用API實現了微軟CSP。爲了兼容NetScape瀏覽器等所支持的PKCS#11,在實現PKCS#ll的基礎上,經過調用PKCS#ll接口實現微軟CSP服務編程接口。這樣在其它操做系統平臺上實現PKCS時也就方便了不少。
用戶界面獲取PIN
當一個應用要求訪問用戶私鑰或其餘身份信息時,必須首先使用用戶身份識別碼(PIN)來認證用戶,如圖所示:用戶界面獲取PIN。經過了認證的程序容許訪問身份密鑰中的用戶敏感數據。用戶程序對身份密鑰中用戶敏感數據的訪問必須在一個事務中完成。事務開始前,身份鑰處於未認狀態;事務結束後,身份密鑰仍然返回未認證狀態。爲了不每一次操做都要求用戶輸入PIN,應該在CSP內部緩存用PIN。全部關於用戶PIN的顯示和操做都必須從這個緩存中直接得到,而且這個緩存的PIN必須與特定登陸用戶和特定用戶身份密鑰同步關聯,一旦登陸用戶改變或身份密鑰從主機中取出,就必須清除相應的PIN緩存。
4、支持的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模塊將進行後續的操做。