在线支付技术总结
- 1 -
目 录
一.电子商务支付概述 -------------------------------------------------------------- 3
名词解释 ---------------------------------------------------------------------- 3 电子商务支付方式类型 ---------------------------------------------------------- 3 电子商务支付安全基本要求 ------------------------------------------------------ 4
二.网银支付 ---------------------------------------------------------------------- 5
网银支付流程 ------------------------------------------------------------------ 5 网银支付数据加密与签名 -------------------------------------------------------- 6
1)DES对称加密技术 ------------------------------------------------------- 6 2)工作原理 --------------------------------------------------------------- 7 3)消息摘要 --------------------------------------------------------------- 8 4)数字签名 --------------------------------------------------------------- 9 5)数字证书 -------------------------------------------------------------- 12 6)PKI体系(公钥基础设施体系) -------------------------------------------- 15 7)目前国内的CA认证机构 ------------------------------------------------- 15 8)安全的通信协议 -------------------------------------------------------- 16 9)第三方支付平台 -------------------------------------------------------- 17
三.邮乐中国网银支付 ------------------------------------------------------------- 18
1)功能描述 ------------------------------------------------------------------ 18 2)数据库结构 ---------------------------------------------------------------- 19 3)时序图 -------------------------------------------------------------------- 19 4)后台主类图 ---------------------------------------------------------------- 19
- 2 -
一.电子商务支付概述 ·名词解释
名 称 EDI 说 明 电子数据交换,是将业务文件按一个公认的标准从一台计算机传输到另一台计算机的电子传输方法,由于EDI在商务活动中大大减少了纸张票据的使用,通常也被称为“无纸贸易”或“无纸交易”。 Secure Electronic Transaction ,安全电子交易协议。是由Master Card和Visa联合Netscape,Microsoft等公司,于1997年6月1日推出的一种新的电子支付模型 安全套接层协议,它是网景( Netscape )公司提出的基于 WEB 应用的安全协议,它为 TCP/IP 连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证 负责颁发证书,认证身份有效性的权威机构 Data Encryption Standard ,一种对称加密算法。即加解密双方在加解密过程中要使用完全相同的一个密钥 一种非对称加密算法。所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密 消息摘要是一种与消息认证码结合使用以确保消息完整性的技术,目前广泛使用的算法有MD4、MD5、SHA-1 PKI(Public Key Infrastructure ) 即\"公钥基础设施\" SET SSL CA认证机构 DES RSA 消息摘要 PKI ·电子商务支付方式类型
1.电子数据交换(EDI)
通过国际统一的EDIFACT标准或者/ansi.X.12标准来格式化报文,以实现交易双方数据的准确性和可靠性,一般通过专有传输网络作为交易通道(VPN等)。 2.网银支付
一般为在互联网中通过数据的加密签名,身份认证系统等方式来实现交易数据的传输。 3.手机支付 与网银支付类似。 4.电子钱包
一种虚拟帐户,可以实现货币的转帐与支付功能 5.电子货币
一种虚拟货币。根据各个电子商务系统的定义不同功能也就不同。 6.线下汇款
通过邮局或者银行汇款方式在实现交易。 7.货到付款
在电子商务系统中下单,客户收到商品后再付款。
- 3 -
·电子商务支付安全基本要求
信息保密性(RSA/DES) 信息完整性(摘要) 交易者身份真实性(证书) 不可抵赖性(签名) 系统的可靠性(SET/SSL)
- 4 -
二.网银支付 ·网银支付流程
提交订单 商户接收订单 订单入库 订单数据加密,签名 签名验证 银行错误提示 转到银行支付页面 提交银行卡信息 支付证书错误提示 扣款是否错误提示 成功提示转向商户页面
- 5 -
·网银支付数据加密与签名 加密技术:
1)DES 对称加密技术
DES算法为密码中的对称密码,又被成为美国数据加密标准,
JAVA 代码实现:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator; import java.security.Key; import java.security.SecureRandom;
/**
* 此例子是对一个字符串信息,用一个私钥(key)加密,然后在用该私钥解密,验证是否一致 * 私钥加密,是对称加密 */
public class PrivateKey {
public static void main(String[] args) throws Exception { String before = \"123456\";
byte[] plainText = before.getBytes(\"UTF8\"); //得到一个使用AES算法的KeyGenerator的实例
KeyGenerator keyGen = KeyGenerator.getInstance(\"AES\"); SecureRandom random=new SecureRandom(); keyGen.init(128, random);
//通过KeyGenerator产生一个key(密钥算法刚才已定义,为AES) Key key = keyGen.generateKey();
System.out.println(\"Finish generating AES key==\"+key);
//获得一个私钥加密类Cipher,定义Cipher的基本信息:ECB是加密方式,PKCS5Padding是填充方法 Cipher cipher = Cipher.getInstance(\"AES/ECB/PKCS5Padding\"); //使用私钥加密
System.out.println(\"\\n用私钥加密...\");
//把刚才生成的key当作参数,初始化使用刚才获得的私钥加密类,Cipher.ENCRYPT_MODE意思是加密 cipher.init(Cipher.ENCRYPT_MODE, key);
//私钥加密类Cipher进行加密,加密后返回一个字节流byte[]
- 6 -
byte[] cipherText = cipher.doFinal(plainText); //以UTF8格式把字节流转化为String
String after1 = new String(cipherText, \"UTF8\"); System.out.println(\"用私钥加密完成:\"+after1);
//使用私钥对刚才加密的信息进行解密,看看是否一致,Cipher.DECRYPT_MODE意思是解密钥 System.out.println(\"\\n用私钥解密...\"); cipher.init(Cipher.DECRYPT_MODE, key);
//对刚才私钥加密的字节流进行解密,解密后返回一个字节流byte[] byte[] newPlainText = cipher.doFinal(cipherText); String after2 = new String(newPlainText, \"UTF8\"); System.out.println(\"用私钥解密完成:\"+after2); } }
2)RSA 非对称加密技术
·工作原理
1.A要向B发送信息,A和B都要产生一对用于加密和解密的公钥和私钥。 2.A的私钥保密,A的公钥告诉B;B的私钥保密,B的公钥告诉A。 3.A要给B发送信息时,A用B的公钥加密信息,因为A知道B的公钥。 4.A将这个消息发给B(已经用B的公钥加密消息)。
5.B收到这个消息后,B用自己的私钥解密A的消息。其他所有收到这个报文的人都无法解密,因为只有B才有B的私钥。
JAVA 代码实现:
import java.security.KeyPair;
import java.security.KeyPairGenerator; import javax.crypto.Cipher;
/** 此例子是一个公钥加密例子,Cipher类使用KeyPairGenerator (顾名思义:一对钥匙生成*器)生成的公钥和私钥 */ public class PublicKey {
public static void main(String[] args) throws Exception {
- 7 -
String before = \"asdf\";
byte[] plainText = before.getBytes(\"UTF8\");
//产生一个RSA密钥生成器KeyPairGenerator(顾名思义:一对钥匙生成器) KeyPairGenerator keyGen = KeyPairGenerator.getInstance(\"RSA\"); //定义密钥长度1024位 keyGen.initialize(1024);
//通过KeyPairGenerator产生密钥,注意:这里的key是一对钥匙!! KeyPair key = keyGen.generateKeyPair(); //获得一个RSA的Cipher类,使用公钥加密
Cipher cipher = Cipher.getInstance(\"RSA/ECB/PKCS1Padding\");
System.out.println(\"\\n用公钥加密...\");
cipher.init(Cipher.ENCRYPT_MODE, key.getPublic()); //用公钥进行加密,返回一个字节流
byte[] cipherText = cipher.doFinal(plainText);
//以UTF8格式把字节流转化为String
String after1 = new String(cipherText, \"UTF8\"); System.out.println(\"用公钥加密完成:\"+after1); //使用私钥解密
System.out.println(\"\\n用私钥解密...\");
//Cipher.DECRYPT_MODE意思是解密,从一对钥匙中得到私钥 key.getPrivate() cipher.init(Cipher.DECRYPT_MODE, key.getPrivate()); //用私钥进行解密,返回一个字节流
byte[] newPlainText = cipher.doFinal(cipherText); String after2 = new String(newPlainText, \"UTF8\"); System.out.println(\"用私钥解密完成:\"+after2); } }
·消息摘要
消息摘要(Message Digest)又称为数字摘要(Digital Digest)。它是一个唯一对应一个消息
或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生。如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知道消息是否被改变了。因此消息摘要保证了消息的完整性。 消息摘要采用单向Hash 函数将需加密的明文\"摘要\"成一串128bit的密文,这一串密文亦称为数字指纹(Finger Print),它有固定的长度,且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。这样这摘要便可成为验证明文是否是\"真身\"的\"指纹\"了。
JAVA 代码实现:
import java.security.MessageDigest; /**
* 消息摘要是一种与消息认证码结合使用以确保消息完整性的技术
* 目前广泛使用的算法有MD4、MD5、SHA-1 * 注意:消息摘要是单向的*/
- 8 -
public class MessageDigestExample {
public static void main(String[] args) throws Exception { String beforeDegist = \"121321312312312\";
System.out.println(\"摘要前:\"+beforeDegist); //初始信息要转换成字节流的形式
byte[] plainText = beforeDegist.getBytes(\"utf8\");
MessageDigest messageDigest = MessageDigest.getInstance(\"MD5\"); System.out.println(\"\\n\" + messageDigest.getProvider().getInfo()); messageDigest.update(plainText);
String afterDegist = new String(messageDigest.digest(),\"utf8\"); System.out.println(\"摘要后:\"+afterDegist); } }
·数字签名
数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送的
公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否
则说明信息被修改过,因此数字签名能够验证信息的完整性。 数字签名是个加密的过程,数字签名验证是个解密的过程。 JAVA代码实现
import java.security.Signature;
import java.security.KeyPairGenerator; import java.security.KeyPair;
import java.security.SignatureException;
/**此例子是数字签名的例子,使用RSA私钥对消息摘要(这里指的是原始数据)进行签名,然后使用公钥验证签名
* A通过使用B的公钥加密数据后发给B,B利用B的私钥解密就得到了需要的数据(进过B公钥加密的数据只有B的私钥能够
* 解开,C没有B的私钥,所以C解不开,但C可以使用B的公钥加密一份数据发给B,这样一来,问题来了,B收到的数据到
* 底是A发过来的还是C发过来的呢)
* 由于私钥是唯一的,那么A就可以利用A自己的私钥进行加密,然后B再利用A的公钥来解密,就可以确定:一定是A的消息,数字签名的原理就基于此
* 总结:A想将目标数据传给B,此时A需要准备1和2两部分
* 1:A使用B的公钥将原始信息加密,以起到保密作用(只有B的私钥能解开,其他人使用其他钥匙都解不开,当然就保密咯)
* 2:A使用A的私钥将原始信息的摘要进行签名,以起到接收方B确定是A发过来的作用(A用A的私钥对目标数据的摘要进行签
* 名,然后传给B,同时,C用C的私钥对任意信息进行签名也传给B,B想接受的是A的数据(比如说一个转帐请求),于是B
* 就通过A的公钥对接受到的两个信息进行解密,解开的就是A(A的公钥能且只能解开A的私钥加密的数据)) */
- 9 -
public class DigitalSignature {
public static void main(String[] args) throws Exception { String before = \"asdf\";
byte[] plainText = before.getBytes(\"UTF8\"); //形成RSA公钥对
KeyPairGenerator keyGen = KeyPairGenerator.getInstance(\"RSA\"); keyGen.initialize(1024);
KeyPair key = keyGen.generateKeyPair(); //使用私钥签名
Signature sig = Signature.getInstance(\"SHA1WithRSA\"); sig.initSign(key.getPrivate());//sig对象得到私钥 //签名对象得到原始数据
sig.update(plainText);//sig对象得到原始数据(现实中用的是原始数据的摘要,摘要的是单向的,即摘要
算法后无法解密)
- 10 -
byte[] signature = sig.sign();//sig对象用私钥对原始数据进行签名,签名后得到签名signature String after1 = new String(signature, \"UTF8\"); System.out.println(\"\\n用私钥签名后:\"+after1); //使用公钥验证
sig.initVerify(key.getPublic());//sig对象得到公钥 //签名对象得到原始信息
sig.update(plainText);//sig对象得到原始数据(现实中是摘要) try {
if (sig.verify(signature)) {//sig对象用公钥解密签名signature得到原始数据(即摘要),一致
则true
System.out.println(\"签名验证正确!!\"); } else {
System.out.println(\"签名验证失败!!\"); }
} catch (SignatureException e) {
System.out.println(\"签名验证失败!!\"); } } }
5.数字证书
数字证书是一种权威性的电子文档,由权威公正的第三方机构,即CA中心签发的证书。它以数字证书为核心的加密技术可以对网络上传输的信息进行加密和解密、数字签名和签名验证,确保网上传递信息的机密性、完整性。 使用了数字证书,即使您发送的信息在网上被他人截获,甚至您丢失了个人的账户、密码等信息,仍可以保证您的账户、资金安全。
它能提供在Internet上进行身份验证的一种权威性电子文档,人们可以在互联网交往中用它来证明自己的身份和识别对方的身份。当然在数字证书认证的过程中证书认证中心(CA)作为权威的、公正的、可信赖的第三方,其作用是至关重要的.如何判断数字认证中心公正第三方的地位是权威可信的,国家工业和信息化部以资质合规的方式,陆续向天威诚信数字认证中心等30家相关机构颁发了从业资质
JDK提供的数字证书生成工具: 1). Keytool 命令工具
Java提供相对简单的被称为keytool的命令行工具,可以简单地产生“自己签名”的证书。自己签名的证书只是用
- 11 -
户产生的证书,没有正式在大家所熟知的认证权威那里注册过,因此不能确保它的真实性。但却能保证数据传输的安全性。
2)利用keytool 创建自己的证书 1.建立证书库(密钥库)
在c盘目录下创建一个证书,指定证书库为BocsoftKeyLib,创建别名为TestCertification的一条证书,它指
定用
RSA
算法生成,且指定密钥长度为
1024,证书有效期为
1
年
将证书导出到证书文件
TC.cer
导出的证书文件无法用文本编辑器正确显示,可以输入如下命令,然后在以记形式打开TC.cer就能看了
X.509证书结构
版本号..................证书的版本标识符(例如,版本3) 序列号 ................标识证书的唯一整数 签名....................用于签证书的算法标识 颁发者 ................证书颁发者的唯一识别名 有效期 ................证书有效时间段
主体....................证书拥有者的唯一识别名 主体公钥信息 ........证书拥有者的公钥(和算法标识符) 颁发者唯一标识符........颁发者的可选唯一标识符 主体唯一标识符 ........主体的唯一识别符 扩展部分 ........可选的扩展
JAVA 代码读取证书信息
import java.security.*;
import java.security.PublicKey; import java.io.*;
- 12 -
import java.util.*;
import java.security.cert.*;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
public class DigitalCertificate {
public static void main(String[] args) { try {
String pass=\"83853582\";
FileInputStream in2=new FileInputStream(\"C:/BocsoftKeyLib\"); KeyStore ks=KeyStore.getInstance(\"JKS\"); ks.load(in2,pass.toCharArray());
String alias = \"TestCertification3\"; //alias为条目的别名 Certificate c=ks.getCertificate(alias);
//获取获取X509Certificate类型的对象,这是证书类获取Certificate的子类,实现了更多方法 X509Certificate t=(X509Certificate)c;
System.out.println(\"版本号:\"+t.getVersion());
System.out.println(\"序列号:\"+t.getSerialNumber().toString()); System.out.println(\"主体名:\"+t.getSubjectDN()); System.out.println(\"签发者:\"+t.getIssuerDN()); System.out.println(\"有效期:\"+t.getNotBefore()); System.out.println(\"签名算法:\"+t.getSigAlgName()); byte [] sig=t.getSignature();//签名值 PublicKey pk = t.getPublicKey(); byte [] pkenc=pk.getEncoded(); System.out.println(\"公钥:\"); for(int i=0;i System.out.println(\"证书的日期有效性检查:有效的证书日期!\"); //验证证书签名的有效性,通过数字证书认证中心(CA)机构颁布给客户的CA证书 FileInputStream in3=new FileInputStream(\"D:\\\ina\\\runk\\\\checkoutnew\\\\conf\\\\beta\\\\wls\\\\cert\\\\cert_2d59.crt\"); //获取CA证书 CertificateFactory cf = CertificateFactory.getInstance(\"X.509\"); Certificate cac = cf.generateCertificate(in3); //获取CA的公钥 PublicKey pbk=cac.getPublicKey(); //c为本地证书,也就是待检验的证书,用CA的公钥校验数字证书c的有效性 X509Certificate CA509=(X509Certificate)cac; - 13 - System.out.println(\"CA-cert_2d59.crt 版本号>>>>>:\"+CA509.getVersion()); System.out.println(\"CA-cert_2d59.crt 序列 号>>>>>:\"+CA509.getSerialNumber().toString()); System.out.println(\"CA-cert_2d59.crt 签名算法>>>>>:\"+CA509.getSigAlgName()); System.out.println(\"CA-cert_2d59.crt 签发者>>>>>:\"+CA509.getIssuerDN()); PublicKey pk2 = CA509.getPublicKey(); byte [] pkenc2=pk2.getEncoded(); System.out.print(\"CA-cert_2d59.crt 公钥>>>>>>:\"); for(int i=0;i } catch(CertificateExpiredException e){//证书的日期有效性检查:过期 System.out.println(\"证书的日期有效性检查:过期\"); } catch(CertificateNotYetValidException e){ //证书的日期有效性检查:尚未生效 System.out.println(\"证书的日期有效性检查:尚未生效\"); } catch (CertificateException ce) { ce.printStackTrace(); } catch (FileNotFoundException fe) { fe.printStackTrace(); } catch (Exception e){ e.printStackTrace(); } } } PKI体系 (公钥基础设施体系) 数字证书 认证中心 注册机构 PKI策略 硬件系统 发布系统 PKI(Public Key Infrastructure ) 即\"公钥基础设施\",是一种遵循既定标准的密钥管理平台,它能够 - 14 - 为所有网络应用提供加密和数字签名等密码服务及所必需的密钥和证书管理体系,简单来说,PKI就是利用公钥理论和技术建立的提供安全服务的基础设施。PKI技术是信息安全技术的核心,也是电子商务的关键和基础技术。 完整的PKI体系必须具有权威认证机构(CA)、数字证书库、密钥备份及恢复系统、证书作废系统、应用接口(API)等基本构成部分,构建PKI也将围绕着这五大系统来着手构建。 1. 目前国内的CA认证机构 山东省数字证书认证管理有限公司 银联金融认证中心有限公司 北京天威诚信电子商务服务有限公司 陕西省数字证书认证中心有限责任公司 国投安信数字证书认证有限公司 广东省电子商务认证有限公司 广东数字证书认证中心有限公司 上海市数字证书认证中心有限公司 北京数字证书认证中心有限公司 辽宁数字证书认证管理有限公司 湖北省数字证书认证管理中心有限公司 颐信科技有限公司 江苏省电子商务证书认证中心有限责任公司 重庆市数字证书认证中心有限公司 浙江省数字安全证书管理有限公司 福建省数字安全证书管理有限公司 数字证书认证中心(有限公司) 各个银行的认证中心 各个省分的认证中心 - 15 - 安全的通信协议 1) SET协议: 为了实现更加完善的即时电子支付,SET协议应运而生。SET协议(Secure Electronic Transaction), 被称之为安全电子交易协议,是由Master Card和Visa联合Netscape,Microsoft等公司,于1997年6月1日推出的一种新的电子支付模型。SET协议是B2C上基于信用卡支付模式而设计的,它保证了开放网络上使用信用卡进行在线购物的安全。SET主要是为了解决用户,商家,银行之间通过信用卡的交易而设计的,它具有的保证交易数据的完整性,交易的不可抵赖性等种种优点,因此它成为目前公认的信用卡网上交易的国际标准。 SET协议的重点就是确保商家和客户的身份认证和交易行为的不可否认性。其理论基础就是不可否认 机制,采用的核心技术包括X.509电子证书标准,数字签名,报文摘要,双重签名等技术。 2) SSL协议和HTTPS协议: (一) SSL协议(Secure Socket Layer,安全套接层)主要是使用公开密钥和X.509数字证书技术保护信 息传输的机密性和完整性,它不能保证信息的不可抵赖性,主要适用于点对点之间的信息传输,常用Web Server方式。 由于SSL没有提供数字签名的功能,因此一直是SSL的一大缺陷。后来由美国MASTERCARD和Visa 信用卡组织制定了SET协议。 - 16 - (二) JAVA与SSL协议实现----JSSE。 JSSE(Java Security Socket Extension,Java安全套接字扩展)是Sun为了解决在Internet上的安全通讯而推出的解决方案。它实现了SSL和TSL(传输层安全)协议。在JSSE中包含了数据加密,服务器验证,消息完整性和客户端验证等技术。通过使用JSSE,开发人员可以在客户机和服务器之间通过TCP/IP协议安全地传输数据。 (三) HTTS协议 HTTPS协议可以简单理解为在HTTP协议之上建立SSL通信,并且使用443端口来与TCP/IP进行信息传递。因此,HTTPS协议是建立在HTTP和SSL之上的一个通信协议。 9.第三方支付平台 1) 2) 3) 4) - 17 - 支付宝 快钱信息 易宝支4ED8 UMPAY 三.邮乐中国网银支付 1.邮乐中国网银下单支付流程 2.邮乐中国网银支付结构 1) 功能描述 1.借助第三方支付平台实现网银支付的功能 2.实现多个第三方支付平台切换的功能 2). 数据库结构 1.Payment 支付记录表 2.Order_Common_Data 网关信息设置 具体表结构请参见: https://svn.rad.tomonline-inc.com/svn/eachnet/trunk/ - 18 - checkoutnew/escrow/doc/ORDER.081125.phase21.doc 5)时序图 1. 前台时序图: ULE创建订单后接下来进入支付流程。支付流程主要由BuyerSelectOrderPayAction 和 BuyerOrderPostPayAction 以及 不同网关的具体实现不同 2.后台主类图: 当前台在调用BuyerOrderPostPayAction的selectOrderBank()方法时,该方法会调用后台接口ctocOrderService.buyerPartPayForItemByBank()方法,返回一系列请求网关的参数(HashTable类型)。 后台的主要作用是根据订单信息和银行ID到网关策略表中确定第三方支付网关接口,签名值和请求参数,返回给前台ACTION。 - 19 - - 20 - 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- sceh.cn 版权所有 湘ICP备2023017654号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务