【密码学】CSP的概念
CSP加密服務提供者(Cryptographic Service Provider)具有一下幾個特點:
一、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模塊將進行后續的操作。
轉載于:https://www.cnblogs.com/qiuxiangmuyu/p/6418869.html
總結
以上是生活随笔為你收集整理的【密码学】CSP的概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA设计模式--单例模式
- 下一篇: German Companies