如何使用USB Key中的证书对数据进行签名

本文详细介绍了如何使用Gemalto的Gemsafe USB Key进行数据签名,通过加载PKI证书,利用USB Key内置的安全特性进行RSA算法签名,确保数据安全。文中提供了使用Visual C++ 6.0的示例代码,并解释了为何通过计算数据的SHA1哈希值进行签名的原因。
摘要由CSDN通过智能技术生成

 

    现在国内银行大量在网上银行中使用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。

GemeSeal 外观(中国版本)

   为完成本文的示例,读者需要在操作系统中安装有“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.csdn.net/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++等。

   首先新建一个窗口程序,下面为具体代码

//  CSDNDemo.cpp : 演示使用Gem eSeal进行签名操作的窗口程序代码
//

#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;             // 哈希对象句柄
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现USBKey的Java应用程序,您需要使用Java Cryptography Architecture(JCA)和Java Cryptography Extension(JCE)等Java安全API。以下是一个简单的USBKey Java实现的示例: ```java import java.io.FileInputStream; import java.security.KeyStore; import java.security.PrivateKey; import java.security.Signature; import java.security.cert.Certificate; public class USBKey { private static final String USBKEY_FILE = "path/to/usbkey/file"; private static final String USBKEY_PASSWORD = "usbkey-password"; private static final String KEY_ALIAS = "key-alias"; private static final String SIGNATURE_ALGORITHM = "SHA256withRSA"; public static void main(String[] args) throws Exception { // 加载USBKey文件 KeyStore keyStore = KeyStore.getInstance("PKCS12"); FileInputStream fis = new FileInputStream(USBKEY_FILE); keyStore.load(fis, USBKEY_PASSWORD.toCharArray()); // 获取私钥和证书 PrivateKey privateKey = (PrivateKey) keyStore.getKey(KEY_ALIAS, USBKEY_PASSWORD.toCharArray()); Certificate cert = keyStore.getCertificate(KEY_ALIAS); // 签名数据 byte[] data = "Hello, USBKey!".getBytes(); Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); signature.initSign(privateKey); signature.update(data); byte[] signedData = signature.sign(); // 验证签名 signature.initVerify(cert); signature.update(data); boolean valid = signature.verify(signedData); System.out.println("签名是否合法: " + valid); } } ``` 该示例加载了USBKey文件,获取了私钥和证书,并使用SHA256withRSA算法对数据进行签名和验证。您可以根据需要调整代码,以便在您的应用程序使用USBKey进行身份验证和数据保护。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值