本文轉自和訊部落格堅實誠金
http://zyf860825.blog.hexun.com/61812512_d.html
USBKey是一種USB介面的硬體裝置。如堅石誠信的ET199Auto,內建16位國外進口高效能智慧卡晶片,有一定的儲存空間,可以儲存使用者的私密金鑰以及數位憑證,利用USBKey內建的RSA公私密金鑰演算法實現對使用者身份的認證。由於使用者私密金鑰儲存在ET199Auto中,同時智慧卡可以很好的防止物理攻擊/邊頻攻擊等竊取手段,從而有效保證任何方式都無法讀取ET199Auto中的私密金鑰,因此保證了使用者認證的安全性。
目前,USBKey已廣泛應用在網上銀行,網上辦公,證券交易,網路遊戲等眾多系統中。那麼USBKey又怎麼與應用系統串連而進行身份認證的呢?實際上,USBKey中儲存者代表使用者身份的數位憑證。一張數位憑證包括:認證資訊+公開金鑰+私密金鑰,其中認證+公開金鑰是可以公開的,私密金鑰是在USBKey中,任何人都無法擷取的。當USBKey插入電腦後,USBKey廠商提供的中介軟體程式會將認證資訊註冊到Windows系統中,應用系統中在認證時通過Windows系統找到使用者認證,該認證通過USBKey廠商的中介軟體找到USBKey中對應的私密金鑰,然後在USBKey中使用私密金鑰進行簽名運算,將結果傳給伺服器認證。過程如下:
網銀àWindows系統中使用者認證àUSBKey中介軟體à私密金鑰簽名à伺服器驗證
本篇文章就介紹一下如何使用微軟CAPI介面完成將USBKey中的憑證註冊到Windows系統中。
(1) 擷取CSP控制代碼。
CryptAcquireContext( &hTokenProv,NULL,"EnterSafe ET199Auto CSP V1.0",PROV_RSA_FULL,NULL)
(2) 擷取USBKey內密鑰控制代碼,這時要注意鎖內密鑰的類型是簽名密鑰(AT_SIGNATURE)或者交換密(AT_KEYEXCHANGE)。
CryptGetUserKey(hTokenProv,AT_KEYEXCHANGE,&hKeyCAPI)
(3) 擷取認證資料(只是認證資訊資料,不包括私密金鑰),這時可以通過兩次調用,先擷取認證資料的長度,分配空間,然後再調用一次。
CryptGetKeyParam(hKeyCAPI, KP_CERTIFICATE, pbCert, &dwCertLen, 0)
(4) 建立CERT_CONTEXT結構
pCertContext =
CertCreateCertificateContext(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
pbCert,
dwCertLen) ;
(5) 開啟MY儲存區,這個就是Windows系統中“個人”認證存放的地區。
hSysStore = CertOpenStore(
CERT_STORE_PROV_SYSTEM_REGISTRY,
0,
0,
CERT_SYSTEM_STORE_CURRENT_USER,
L"MY");
(6) 設定認證內容屬性。這時要先聲明CRYPT_KEY_PROV_INFO結構
CRYPT_KEY_PROV_INFO ckpi = {0};
ckpi.pwszProvName = L" EnterSafe ET199Auto CSP V1.0";
ckpi.pwszContainerName = pbWideContainer;
ckpi.dwProvType = PROV_RSA_FULL;
ckpi.dwKeySpec = AT_KEYEXCHANGE;
ckpi.dwFlags = CERT_KEY_CONTEXT_PROP_ID;
ckpi.cProvParam = 0;
ckpi.rgProvParam = NULL;
CertSetCertificateContextProperty(
pCertContext,
CERT_KEY_PROV_INFO_PROP_ID,
CERT_STORE_NO_CRYPT_RELEASE_FLAG,
&ckpi)
(7) 將憑證註冊到Windows系統中。
CertAddCertificateContextToStore(
hSysStore,
pCertContext,
CERT_STORE_ADD_REPLACE_EXISTING,
NULL);
(8) 釋放CSP控制代碼。
CryptReleaseContext(hTokenProv,0)
通過上述步驟就可以將ET199Auto中的憑證註冊到Windows系統中了。我們可以在IE--Internet選項--內容--認證--個人下面查看到ET199Auto中的認證。