电子商务在线支付技术总结.docx
《电子商务在线支付技术总结.docx》由会员分享,可在线阅读,更多相关《电子商务在线支付技术总结.docx(21页珍藏版)》请在冰豆网上搜索。
电子商务在线支付技术总结
在线支付技术总结
目录
一.电子商务支付概述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
一.电子商务支付概述
·名词解释
名称
说明
EDI
电子数据交换,是将业务文件按一个公认的标准从一台计算机传输到另一台计算机的电子传输方法,由于EDI在商务活动中大大减少了纸张票据的使用,通常也被称为“无纸贸易”或“无纸交易”。
SET
SecureElectronicTransaction,安全电子交易协议。
是由MasterCard和Visa联合Netscape,Microsoft等公司,于1997年6月1日推出的一种新的电子支付模型
SSL
安全套接层协议,它是网景(Netscape)公司提出的基于WEB应用的安全协议,它为TCP/IP连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证
CA认证机构
负责颁发证书,认证身份有效性的权威机构
DES
DataEncryptionStandard,一种对称加密算法。
即加解密双方在加解密过程中要使用完全相同的一个密钥
RSA
一种非对称加密算法。
所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密
消息摘要
消息摘要是一种与消息认证码结合使用以确保消息完整性的技术,目前广泛使用的算法有MD4、MD5、SHA-1
PKI
PKI(PublicKeyInfrastructure)即"公钥基础设施"
·电子商务支付方式类型
1.电子数据交换(EDI)
通过国际统一的EDIFACT标准或者/ansi.X.12标准来格式化报文,以实现交易双方数据的准确性和可靠性,一般通过专有传输网络作为交易通道(VPN等)。
2.网银支付
一般为在互联网中通过数据的加密签名,身份认证系统等方式来实现交易数据的传输。
3.手机支付
与网银支付类似。
4.电子钱包
一种虚拟帐户,可以实现货币的转帐与支付功能
5.电子货币
一种虚拟货币。
根据各个电子商务系统的定义不同功能也就不同。
6.线下汇款
通过邮局或者银行汇款方式在实现交易。
7.货到付款
在电子商务系统中下单,客户收到商品后再付款。
·电子商务支付安全基本要求
信息保密性(RSA/DES)
信息完整性(摘要)
交易者身份真实性(证书)
不可抵赖性(签名)
系统的可靠性(SET/SSL)
二.网银支付
·网银支付流程
·网银支付数据加密与签名
加密技术:
1)DES对称加密技术
DES算法为密码体制中的对称密码体制,又被成为美国数据加密标准,
JAVA代码实现:
importjavax.crypto.Cipher;
importjavax.crypto.KeyGenerator;
importjava.security.Key;
importjava.security.SecureRandom;
/**
*此例子是对一个字符串信息,用一个私钥(key)加密,然后在用该私钥解密,验证是否一致
*私钥加密,是对称加密
*/
publicclassPrivateKey{
publicstaticvoidmain(String[]args)throwsException{
Stringbefore="123456";
byte[]plainText=before.getBytes("UTF8");
//得到一个使用AES算法的KeyGenerator的实例
KeyGeneratorkeyGen=KeyGenerator.getInstance("AES");
SecureRandomrandom=newSecureRandom();
keyGen.init(128,random);
//通过KeyGenerator产生一个key(密钥算法刚才已定义,为AES)
Keykey=keyGen.generateKey();
System.out.println("FinishgeneratingAESkey=="+key);
//获得一个私钥加密类Cipher,定义Cipher的基本信息:
ECB是加密方式,PKCS5Padding是填充方法
Ciphercipher=Cipher.getInstance("AES/ECB/PKCS5Padding");
//使用私钥加密
System.out.println("\n用私钥加密...");
//把刚才生成的key当作参数,初始化使用刚才获得的私钥加密类,Cipher.ENCRYPT_MODE意思是加密
cipher.init(Cipher.ENCRYPT_MODE,key);
//私钥加密类Cipher进行加密,加密后返回一个字节流byte[]
byte[]cipherText=cipher.doFinal(plainText);
//以UTF8格式把字节流转化为String
Stringafter1=newString(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);
Stringafter2=newString(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代码实现:
importjava.security.KeyPair;
importjava.security.KeyPairGenerator;
importjavax.crypto.Cipher;
/**此例子是一个公钥加密例子,Cipher类使用KeyPairGenerator
(顾名思义:
一对钥匙生成*器)生成的公钥和私钥*/
publicclassPublicKey{
publicstaticvoidmain(String[]args)throwsException{
Stringbefore="asdf";
byte[]plainText=before.getBytes("UTF8");
//产生一个RSA密钥生成器KeyPairGenerator(顾名思义:
一对钥匙生成器)
KeyPairGeneratorkeyGen=KeyPairGenerator.getInstance("RSA");
//定义密钥长度1024位
keyGen.initialize(1024);
//通过KeyPairGenerator产生密钥,注意:
这里的key是一对钥匙!
!
KeyPairkey=keyGen.generateKeyPair();
//获得一个RSA的Cipher类,使用公钥加密
Ciphercipher=Cipher.getInstance("RSA/ECB/PKCS1Padding");
System.out.println("\n用公钥加密...");
cipher.init(Cipher.ENCRYPT_MODE,key.getPublic());
//用公钥进行加密,返回一个字节流
byte[]cipherText=cipher.doFinal(plainText);
//以UTF8格式把字节流转化为String
Stringafter1=newString(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);
Stringafter2=newString(newPlainText,"UTF8");
System.out.println("用私钥解密完成:
"+after2);
}
}
·消息摘要
消息摘要(MessageDigest)又称为数字摘要(DigitalDigest)。
它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生。
如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知道消息是否被改变了。
因此消息摘要保证了消息的完整性。
消息摘要采用单向Hash函数将需加密的明文"摘要"成一串128bit的密文,这一串密文亦称为数字指纹(FingerPrint),它有固定的长度,且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。
这样这摘要便可成为验证明文是否是"真身"的"指纹"了。
JAVA代码实现:
importjava.security.MessageDigest;
/**
*消息摘要是一种与消息认证码结合使用以确保消息完整性的技术
*目前广泛使用的算法有MD4、MD5、SHA-1
*注意:
消息摘要是单向的*/
publicclassMessageDigestExample{
publicstaticvoidmain(String[]args)throwsException{
StringbeforeDegist="121321312312312";
System.out.println("摘要前:
"+beforeDegist);
//初始信息要转换成字节流的形式
byte[]plainText=beforeDegist.getBytes("utf8");
MessageDigestmessageDigest=MessageDigest.getInstance("MD5");
System.out.println("\n"+messageDigest.getProvider().getInfo());
messageDigest.update(plainText);
StringafterDegist=newString(messageDigest.digest(),"utf8");
System.out.println("摘要后:
"+afterDegist);
}
}
·数字签名
数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。
接收者只有用发送的公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。
如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。
数字签名是个加密的过程,数字签名验证是个解密的过程。
JAVA代码实现
importjava.security.Signature;
importjava.security.KeyPairGenerator;
importjava.security.KeyPair;
importjava.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的私钥加密的数据))
*/
publicclassDigitalSignature{
publicstaticvoidmain(String[]args)throwsException{
Stringbefore="asdf";
byte[]plainText=before.getBytes("UTF8");
//形成RSA公钥对
KeyPairGeneratorkeyGen=KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024);
KeyPairkey=keyGen.generateKeyPair();
//使用私钥签名
Signaturesig=Signature.getInstance("SHA1WithRSA");
sig.initSign(key.getPrivate());//sig对象得到私钥
//签名对象得到原始数据
sig.update(plainText);//sig对象得到原始数据(现实中用的是原始数据的摘要,摘要的是单向的,即摘要算法后无法解密)
byte[]signature=sig.sign();//sig对象用私钥对原始数据进行签名,签名后得到签名signature
Stringafter1=newString(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(SignatureExceptione){
System.out.println("签名验证失败!
!
");
}
}
}
5.数字证书
数字证书是一种权威性的电子文档,由权威公正的第三方机构,即CA中心签发的证书。
它以数字证书为核心的加密技术可以对网络上传输的信息进行加密和解密、数字签名和签名验证,确保网上传递信息的机密性、完整性。
使用了数字证书,即使您发送的信息在网上被他人截获,甚至您丢失了个人的账户、密码等信息,仍可以保证您的账户、资金安全。
它能提供在Internet上进行身份验证的一种权威性电子文档,人们可以在互联网交往中用它来证明自己的身份和识别对方的身份。
当然在数字证书认证的过程中证书认证中心(CA)作为权威的、公正的、可信赖的第三方,其作用是至关重要的.如何判断数字认证中心公正第三方的地位是权威可信的,国家工业和信息化部以资质合规的方式,陆续向天威诚信数字认证中心等30家相关机构颁发了从业资质
JDK提供的数字证书生成工具:
1).Keytool命令工具
Java提供相对简单的被称为keytool的命令行工具,可以简单地产生“自己签名”的证书。
自己签名的证书只是用户产生的证书,没有正式在大家所熟知的认证权威那里注册过,因此不能确保它的真实性。
但却能保证数据传输的安全性。
2)利用keytool创建自己的证书
1.建立证书库(密钥库)
在c盘目录下创建一个证书,指定证书库为BocsoftKeyLib,创建别名为TestCertification的一条证书,它指定用RSA算法生成,且指定密钥长度为1024,证书有效期为1年
将证书导出到证书文件TC.cer
导出的证书文件无法用文本编辑器正确显示,可以输入如下命令,然后在以记形式打开TC.cer就能看了
X.509证书结构
版本号..................证书的版本标识符(例如,版本3)
序列号................标识证书的唯一整数
签名....................用于签证书的算法标识
颁发者................证书颁发者的唯一识别名
有效期................证书有效时间段
主体....................证书拥有者的唯一识别名
主体公钥信息........证书拥有者的公钥(和算法标识符)
颁发者唯一标识符........颁发者的可选唯一标识符
主体唯一标识符........主体的唯一识别符
扩展部分........可选的扩展
JAVA代码读取证书信息
importjava.security.*;
importjava.security.PublicKey;
importjava.io.*;
importjava.util.*;
importjava.security.cert.*;
importjava.security.cert.Certificate;
importjava.security.cert.CertificateFactory;
publicclassDigitalCertificate{
publicstaticvoidmain(String[]args){
try{
Stringpass="83853582";
FileInputStreamin2=newFileInputStream("C:
/BocsoftKeyLib");
KeyStoreks=KeyStore.getInstance("JKS");
ks.load(in2,pass.toCharArray());
Stringalias="TestCertification3";//alias为条目的别名
Certificatec=ks.getCertificate(alias);
//获取获取X509Certificate类型的对象,这是证书类获取Certificate的子类,实现了更多方法
X509Certificatet=(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();//签名值
PublicKeypk=t.getPublicKey();
byte[]pkenc=pk.getEncoded();
System.out.println("公钥:
");
for(inti=0;iSystem.out.print(pkenc[i]+",");
}
//证书的日期有效性检查,颁发的证书都有一个有效性的日期区间
DateTimeNow=newDate();
t.checkValidity(TimeNow);
System.out.println("证书的日期有效性检查:
有效的证书日期!
");
//验证证书签名的有效性,通过数字证书认证中心(CA)机构颁布给客户的CA证书
FileInputStreamin3=newFileInputStream("D:
\\ulechina\\trunk\\checkoutnew\\conf\\beta\\wls\\cert\\cert_2d59.crt");
//获取CA证书
CertificateFactorycf=CertificateFact