现在国内银行大量在网上银行中使用USB Key来加强网络银行的安全性,从技术角度来看,USB Key使用的PKI架构无疑比单纯的用户名/密码、动态密码以及文件证书来的安全很多。
在本文中,我将演示如何使用USB Key来对一段信息(文件或者消息)进行签名。
本文使用Gemalto(原为Gemplus)的Gemsafe解决方案作为示例,Gemsafe可以支持众多智能卡读卡器+智能卡卡片以及USB Key,本文使用的是GemeSeal USB Key。目前,国内有多家主流银行OEM使用Gem eSeal USB Key作为网上银行的安全方案。下图为两种在中国市场上可以看到的Gem eSeal USB Key。
为完成本文的示例,读者需要在操作系统中安装有“Gemplus GemSAFE Card CSP”。CSP(Crypto Service Provider)是微软定义的一套安全API集合,开发人员可以通过这套API来抽象不同的安全实体(如USB Key,只能卡设备,安全存储设备驱动,生物识别设备等等),而不需要关心提供安全保障设备的具体细节。“Gemplus GemSAFE Card CSP”可以从单独的Gemsafe解决方案中安装,也可以从国内各个银行OEM的设备驱动中安装。目前,GemSAFE的主流版本为5.X,这个版本支持主流Windows操作系统以及Linux和Mac OS操作系统。
如何检查GemSAFE CSP是否已经安装?在注册表“HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Cryptography/Defaults/Provider” 下可以看到目前操作系统上已经安装和操作系统内置的CSP。需要注意的是,Windows 2000,XP和2003内置了一个较低版本的“Gemplus GemSAFE Card CSP v1.0”,这个CSP只能支持智能卡设备和实现有限的功能,读者需要注意区别其与“Gemplus GemSAFE Card CSP”之间的区别。安装“Gemplus GemSAFE Card CSP”之后,这个较低版本的CSP会被移除。
此外,为了能进行签名操作,还需要在USB Key上加载一个PKI证书,证书可以从不同的CA平台上生成和获得(如各个国内银行、政府机构和CA提供商),下面附有一个示例用途的证书。http://dl2.youkuaiyun.com/down4/20070729/29200708459.pfx
一般而言,网络银行系统会将证书直接签发到USB Key上,USB Key通过内置的COS(Card OS)来保证证书中的机密信息(即证书的私钥)不能被导出,任何使用私钥的运算必须在USB Key内部完成,并需要用户校验USB Key的PIN码。USB Key PIN会在多次失败尝试后自动锁定以防止外界攻击。因此,相比使用软件证书的网络银行系统而言,使用USB Key的网络银行系统能更好的保证安全性。
目前Gem eSeal USB Key可以支持主流的512bit、1024bit和2048bit长度的RSA算法密钥以及相应的证书,下图为加载了上文的示例用途的证书后的Gem eSeal USB Key。
下面,我们可以开始使用“Gemplus GemSAFE Card CSP”来进行开发。以Microsoft Visual C++ 6.0为例,一般而言,此类程序可以使用任何可以调用Windows API的开发环境来进行开发,例如MS Visual Studio 6.0/2003/2005, Delphi,Java,Dev C++等。
首先新建一个窗口程序,下面为具体代码
//
#include " stdafx.h "
#include < stdlib.h >
#include < stdio.h >
#include < conio.h >
#include < ctype.h >
#include < windows.h >
#include < tchar.h >
#include < stdio.h >
#include < wincrypt.h > // 需要引入Windows Crypto API的头文件
int main( int argc, char * argv[])
{
DWORD i;
char * szFileName[ 256 ];
BOOL rslt; // 存放函数返回
FILE * fp = NULL;
BYTE Buffer[ 512 ];
DWORD ulLen;
HCRYPTPROV hProv; // CSP句柄
HCRYPTKEY hKey; // 证书私钥句柄
HCRYPTHASH hHash; // 哈希对象句柄