http://www.ChinaPay.com NetPayClient用户手册
图1 RSA算法示意图
3.4.2. 隐秘钥密码体系(Secret-key Cryptography)
隐秘钥密码体系,又称对称密码体系。它是一种使用同一个密钥进行数据加密和数据解密的技术,该密钥被称之为隐秘钥(Secret-key)。一对用户共享一个隐秘钥,并确保该密钥的私有性控制在他们之间。用一个隐秘钥进行加密的数据只能使用相同的密钥进行解密。目前使用最广泛的为DES(Data Encryption Standard)、3DES等算法,这些算法为美国联邦数据安全标准。见图示:
图2 DES算法示意图
3.4.3. 摘要算法
摘要算法是一种方法,它将一个任意长度的数据变换为一个定长的数据串,这一定长的数据串被称为消息摘要,也有数据指纹之称。合格的摘要算法必须满足下列条件:
找出具有相同摘要的消息集合在技术上是不可能的;
对一给定的消息摘要,反向计算出消息本身在技术上是不可行的。 数据发送方在数据发送前,首先用摘要算法对数据计算消息摘要,然后将数据和消息摘要一起发送给接受方。接受方用相同的摘要算法对数据重新计算消息摘要,通过对二个消息摘要的比较,可以明确地判断出数据在传输过程中是否被篡改。结果相同表示数据未被修改,而结果不同表明数据被修改或数据被丢失,从而保证数据在传输过程中的完整性。常用的摘要算法有MD2和MD5,它是由RSA实验室发明的,具体算法请参阅RFC1319和RFC1321。 见图示:
第 6 页 共 27 页
http://www.ChinaPay.com NetPayClient用户手册
图3 摘要算法示意图
3.4.4. 数字签名
数字签名实际上是非对称密码算法和消息摘要算法的一种组合应用,其目的在于:如某人张三对一段消息进行了数字签名,那么其它的人都能验证这个签名确实是张三签的,同时也能验证张三签名后数据是否被篡改。下面的例子将详细介绍Alice如何对一份合同M进行数字签名,同时Bob又是如何来验证她所签的合同。见图示:
图4 数字签名示意图
? Alice准备了一份合同M;
第 7 页 共 27 页
http://www.ChinaPay.com NetPayClient用户手册
? Alice用摘要算法计算出该合同M的消息摘要MD;
? Alice用非对称算法和自己的私钥对合同消息摘要MD进行加密,该密文S就是合
同的数字签名;
? Alice将合同M和合同的数字签名S合并在一起,通过网络传送到合同的接受者
Bob;
? Bob收到Alice的合同M及合同的数字签名S;
? Bob用Alice的公钥对合同签名S进行解密,得到Alice计算的合同摘要MD; ? Bob采用相同摘要算法对收到的合同重新计算消息摘要MD'; ? Bob比较MD与MD'是否相等? ? 如结果相等,根据摘要算法的特性表明合同在传输过程中未被篡改。同时由于非对
称加密算法的特性可以断定合同确实是Alice发送的,因为用Alice公钥能解密成功的数据只有Alice用她自己私钥对其进行加密才能产生,而她的私钥其它人是无法获取的。
3.4.5. 数字信封
数字信封是一种非对称密码算法和对称密码算法组合应用,用于通信双方间的安全文件交换。下面的例子将详细介绍Alice如何利用数字信封将合同安全地传送给Bob。见图示:
图5 数字信封过程示意图
? ? ? ? ? ? ? ?
Alice准备了一份合同M; Alice生成一个随机数;
Alice选用该随机数作为密钥对合同M进行对称加密,生成密文合同; Alice选用Bob公钥对随机数进行非对称加密,生成信封; Alice将密文合同和信封一起发送给Bob; Bob接受Alice发送的密文合同和信封;
Bob选用自己的私钥对信封进行解密,得到对称密钥(随机数); Bob使用该对称密钥(随机数)对密文合同进行解密,得到合同M。
第 8 页 共 27 页
http://www.ChinaPay.com NetPayClient用户手册
3.5. 客户端NetPayClient在各系统下的安装及调用
3.5.1. 说明
NetPayClient是一个安装在ChinaPay商户会员侧的应用编程接口函数库(API LIB)。 它与商户网上柜面系统相集成,实现消费者、商户和银行间的网上安全支付。提供如下功能:
? 商户对订单关键信息进行数字签名 ? 商户验证ChinaPay发送的交易应答 ? 商户对一段字符串的签名 ? 商户对一段字符串的签名验证
3.5.2. NetPayClient for Java 使用说明
3.5.2.1 核心文件清单 名 称 MerPrk.key PgPubk.key 放置的路径 可以放置到任意路径下,但是需要调用方法指定文件位置和名称 可以放置到任意路径下,但是需要调用方法指定文件位置和名称 用 途 用于提供数字签名的方法调用 商户签名私钥 ChinaPay签名公钥 netpayclinet.jar 根据项目工程的需要放置对应路径下 3.5.2.2 方法说明
? 创建公/私钥对象buildKey
方法说明:
public boolean buildKey (String MerId, int KeyUsage, String KeyFile) 作用:
用于创建私/公钥的对象,用于签名或者验证签名。 参数说明:
String MerId 商户号,长度为15个字节的数字串,由ChinaPay分配。 int KeyUsage 使用私/公钥的方式,固定为 0 。
String KeyFile 私/公钥的文件路径(包含文件名称)。例如:\MerPrk.key” 返回值:
true 表示找到正确的私/公钥文件,并且可以调用签名方法签名或者签名验证方法验证签名, false 表示创建私/公钥对象失败,不可以使用签名方法和签名验证方法。 注:该方法在类chinapay. PrivateKey中。
? 订单签名函数signOrder
方法说明:
第 9 页 共 27 页
http://www.ChinaPay.com NetPayClient用户手册
public String signOrder(String MerId, String OrdId, String TransAmt, String CuryId, String TransDate, String TransType)
作用:
对传入的参数进行数字签名。 参数说明:
String MerId 商户号,长度为15个字节的数字串,由ChinaPay分配。
String OrdId 订单号,长度为16个字节的数字串,由商户系统生成,失败的订单号允许重复支付。 String TransAmt 交易金额,长度为12个字节的数字串,例如:数字串\表示12.34元。 String CuryId
货币代码, 长度为3个字节的数字串,目前只支持人民币,取值为\。
String TransDate 交易日期,长度为8个字节的数字串,表示格式为:YYYYMMDD。
String TransType 交易类型,长度为4个字节的数字串,取值范围为:\和\, 其中\表示消费交易,\表示退货交易。
返回值:
String CheckValue[256] 即NetPayClient根据上述输入参数生成的商户数字签名,长度为256字节的字符串。
注:该方法在类chinapay. SecureLink中。
? 验证交易应答函数verifyTransResponse
方法说明:
public boolean verifyTransResponse(String MerId, String OrdId, String TransAmt, String CuryId, String TransDate, String TransType, String OrderStatus, String CheckValue)
作用:
验证传入参数的数字签名是否正确。 参数说明: String MerId String OrdId String CuryId
商户号,长度为15个字节的数字串,由ChinaPay分配。
订单号,长度为16个字节的数字串,由商户系统生成,失败的订单号允许重复支付。 货币代码, 长度为3个字节的数字串,目前只支持人民币,取值为\。
String TransAmt 交易金额,长度为12个字节的数字串,例如:数字串\表示12.34元。 String TransDate 交易日期,长度为8个字节的数字串,表示格式为: YYYYMMDD。
String TransType 交易类型,长度为4个字节的数字串,取值范围为:\和\, 其中\表示消费交易,\表示退货交易。
String OrderStatus 交易状态,长度为4个字节的数字串。详见交易状态码说明。
String CheckValue 校验值,即ChinaPay对交易应答的数字签名,长度为256字节的字符串。 返回值:
true 表示成功,即该交易应答为ChinaPay所发送,商户根据“交易状态”进行后续处理;否则表示失败,即无效应答,商户可忽略该应答。 注:该方法在类chinapay. SecureLink中。
? 对一段字符串的签名函数Sign
方法说明:
public String Sign (String SignMsg) 作用:
对传入的参数字符串进行数字签名。
第 10 页 共 27 页