`
jameswxx
  • 浏览: 776451 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

建设银行对接(一)

    博客分类:
  • java
阅读更多

 

         这几天 项目需要对接建设银行的支付和查询功能,在支付和查询的时候将系统链接到建行指定的页面上,由于这些页面是基于互联网的,开放的,所以需要对数据加密和数字签名。 我来实现这个数据加密解密模块,功能已经完成了,唉,不过让我晕死的是,建行其实一并提供了 jar 包,已经实现了数据加密解密,校验数字签名的功能,只不过同事没注意到,只发接口文档给我,没发 jar 包给我,害我白着急了几天,不过工作也没算浪费,自己实现的还是比较放心些吧。这些页面的跳转没什么技术,主要在于数据加密和数字签名,在链接到建行页面之前,先将参数加密,在收到建行跳转过来的链接参数后,取出参数里的签名,将签名和原始参数进行校验,以确认目前跳转过来的的确是建行。页面跳转没什么好说的,我所感兴趣的在于加密这些地方,以及对建行文档的理解。

按照建行的规定,我们发送的数据需要进行 MD5 加密,建行对返回的数据进行了数字签名,我们需要校验签名的有效性。以下是建行的两项约定:

 

建行附录 1 MAC 算法说明

      建设银行家居银行项目组决定对商户向网上银行系统提交的交易内容进行MAC校验,校验算法采用标准MD5算法,不带密钥。该算法的详细说明请参见RFC 1321文档。

    商户实行标准的MD5算法对向网上银行系统提交的交易内容进行MAC校验,产生128位(bit)的MAC结果。输入为字符串,输出为16进制字符表示的字符串。

下面是对MAC结果的显示方式的描述:

对128位的交易结果按4位为一个单位进行划分,共获得32段

将每段看成一个16进制数,如0011为0X3,1101为0Xd。

将这个数映射到ASCII码表,形成相应的字符,如0X2为“2”,0Xd为“d”。

将这些字符连成一个字符串,长度为32。

 

    下面是一些字符串进行MAC并按上述方法进行转换后获得的结果:

MD5 ("") = d41d8cd98f00b204e9800998ecf8427e

MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661

MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
 

 

建行附录 2 :数字签名算法说明

     

 银行将客户支付信息实时通知给商户时,使用的数字签名算法是MD5withRSA算法。商户验证签名的公钥在商户在网银系统开户,获取数字证书后,登录到网银系统中,通过下载公钥交易获取。(下载后需妥善管理并及时更新商户公钥,以防公私钥不匹配造成验签不通过)。(目前家居银行项目组采用静态密钥对,上线前生成一对,发给合作商户。)

      商户获取的公钥用X.509格式表示,并且将其按照每4位(bit)转换为一个16进制数的方式表示,产生16进制的字符串。家居银行使用标准MD5withRSA算法对给商户的响应进行签名,产生1024位(bit)的签名结果,并且将其按照每4位(bit)转换为一个16进制数的方式表示,形成16进制的字符串,长度为256。

 

下面是对签名结果的表示方式的描述:

对1024位的交易结果按4位为一个单位进行划分,共获得256段

将每段看成一个16进制数,如0011为0X3,1101为0Xd。

将这个数映射到ASCII码表,形成相应的字符,如0X2为“2”,0Xd为“d”。

将这些字符连成一个字符串,长度为256。

 

例如:

待签名的字符串为:

POSID=000000000&BRANCHID=110000000&ORDERID=19991101234&PAYMENT=500.00&CURCODE=01&REMARK1=19991101&REMARK2=merchantname&SUCCESS=Y

签名结果为:

4b3ef029516193b7d969ac1840083635a3e0901b8cd526caa44c1a072f496d7f0d4bca3942c0d9030bede37c7809b835cec787eb39e18b7596a724fba9805b24714dfbb0f4a3fb430b32e075254a114d4c38a0ac52ef46a0ad33dec3fbfc15417402a1399e65e46996c0cf49fc7ffca9222f8cd693c8376b6f928828967bec42

 

      当商户收到银行传来的CGI串后,从中获取签名(格式如上)和需签名的原文。商户端程序(商户自行开发MD5withRSA签名校验程序)将签名和商户端的公钥转换成二进制格式,与签名的原文一起对签名的正确性进行校验,校验步骤如下:

使用公钥进行签名的逆运算

使用标准MD5算法运算原文

比较1)、2)结果。
 

 

 

 

        仔细看上面两项约定,无论是 MD5 加密还是 RSA 加密,都有一个基础工作,就是将二进制数据分割,换算成 16 进制字符,还需要进行逆运算。将结果按 4 位为一个单位进行划分,共获得 32 段, 将每段看成一个 16 进制数,如 0011 0X3 1101 0Xd 将这个数映射到 ASCII 码表,形成相应的字符,如 0X2 为“ 2 ”, 0Xd 为“ d ”。 将这些字符连成一个字符串,长度为 32 我先实现这个功能,代码如下:

ByteUtil.java

package cn.ipanel.payment.business.bank.ccb.encryption;

 /**
 * 字节运算工具,其作用和背景请见建行接口文档的"附录1:MAC算法说明"
 *
 * @author wangxiaoxue
 *
 */
public class ByteUtil {
     // 用来将字节转换成 16 进制表示的字符
    private static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7',

           '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

     /**
     * 找到字符在数组中的位置
     *
     * @param c
     * @return
     */
    private static int getIndex(char c) {
       int p = -1;
       for (int i = 0; i < hexDigits.length; i++) {
           if (hexDigits[i] == c) {
              p = i;
              break;
           }
       }
       return p;
    }

     /**
     * 将字节转化成字符串,转换算法如下:<br>
     * 1:每个字节长度为8位,分割为两个4位,高四位和低四位<br>
     * 2:将每个四位换算成16进制,并且对应ascii码,如0x01对应1,0x0d对应d,具体对应关系请见数组hexDigits[]<br>
     * 3:将得到的字符拼成字符串
     *
     * @param bytes
     * @return
     */
    public static String byteToChar(byte[] bytes) {
       // 每个字节用 16 进制表示的话,使用两个字符,所以字符数组长度是字节数字长度的2倍
       char str[] = new char[bytes.length * 2]; 
       // 表示转换结果中对应的字符位置
       int  = 0;
        // 每一个字节转换成 16 进制字符
       for (int i = 0; i < bytes.length; i++) {
           byte byte0 = bytes[i]; // 取第 i 个字节
           // 取字节中高 4 位(左边四位)的数字转换,>>>为逻辑右移,右移后,高四位变成低四位,需要对低四位之外的值进行消零运算
           str[k++] = hexDigits[byte0 >>> 4 & 0xf];
            // 取字节中低 4 位(右边四位)的数字转换,并且和0xf进行"逻辑与"运算,以消除高位的值,得到纯净的低四位值
           str[k++] = hexDigits[byte0 & 0xf];
       }
       return new String(str);
    }
 
    /**
     * 将字节转换成二进制数组,是byteToChar方法的逆运算,转换算法如下:<br>
     * 1:将字符按顺序每两个分为一组,分别找出每个字符在映射表hexDigits[]中的索引值,请见getIndex(char c)方法<br>
     * 2:每两个字符一组进行运算,将第一个字符的索引值逻辑左移四位,并和"0xf"进行"逻辑或"运算,目的是将低四位都设置为1,因为逻辑左移后,低四位都变成0了<br>
     * 3:将第二个字符的索引值和
"0xf0"进行"逻辑或"运算,目的的是将高位设置为1<br>
     * 4:将两个运算完的索引值进行"逻辑与"运算,得到了两个字符所代表的一个字节值<br>
     * 5:依次运算,最后得到字节数组,返回
     *
     * @param str
     * @return
     */
    public static byte[] charToByte(String str) {
       char[] chars = str.toCharArray();
       byte[] bytes = new byte[chars.length / 2];
       int k = 0;
       for (int i = 0; i < chars.length; i = i + 2) {
           // 得到索引值
           byte high = (byte) getIndex(chars[i]);
           byte low = (byte) getIndex(chars[i + 1]);
           // 第一个字符索引逻辑左移四位,并进行或运算,将低四位设置为1
           high = (byte) ((high << 4) | 0xf);
            // 第二个字符索引进行或运算,将高四位设置为1
           low = (byte) (low | 0xf0);
            // 两个字节进行与运算
           bytes[k++] = (byte) (high & low);
       }
       return bytes;
    }

     public static void main(String[] args) { 
       String str = "abgcd1234";
       System.out.println("原始字符串:" + str);
       String result = ByteUtil.byteToChar(str.getBytes());
       System.out.println("运算结果:" + result);
       byte[] resultbytes = ByteUtil.charToByte(result);
       System.out.println("逆运算结果:" + new String(resultbytes)); 
    }
}


10
0
分享到:
评论
2 楼 极客_王超 2015-08-17  
gcedar 写道
把银行的东西都公布贴出来了,这样也可以??牛啊,被黑客利用了就傻了

不贴出来你他妈看得懂?
1 楼 gcedar 2014-03-17  
把银行的东西都公布贴出来了,这样也可以??牛啊,被黑客利用了就傻了

相关推荐

    软件系统平台对接接口方案

    总的来说,软件系统平台对接接口方案设计是一项综合性的任务,需要兼顾接口的规范性、灵活性、安全性和效率。通过科学的接口设计和实现,可以构建出强大而健壮的信息系统,满足日益复杂的企业或组织需求,促进信息...

    建设银行【善付通】支付结算接入文档

    善付通是建设银行在善融商务平台上为供应链企业提供的一种高效、便捷的支付结算解决方案,旨在帮助企业优化订单管理、协同作业、收付款流程,减少错误和提升效率。 善付通的核心功能模块包括: 1. **采购订单管理**...

    建行互联网被扫支付接口Socket商户验签jar包

    -- 中国建设银行商户通知验签配置文件 --&gt; &lt;!-- 通讯端口1024~65535之间未被使用的端口 --&gt; &lt;value&gt;55533 &lt;!-- 通讯端口1024~65535之间未被使用的端口 --&gt; &lt;value&gt;5 &lt;!-- 可按照不同的柜台号配置不同...

    建设银行银企直联对接系统资料

    建设银行银企直联主要应用于企业的资金管理、资金归集、资金调拨等方面。通过银企直联系统,企业可以实现对其银行账户的全面管理,包括余额查询、明细查询、转账、代发工资等。同时,企业还可以利用银企直联系统进行...

    _网银外联平台用户手册(Jar包版)_V1.11_201901241

    【网银外联平台用户手册】是针对使用Java开发的企业网银系统与银行外联平台进行接口对接的指导文档。该手册主要介绍了如何利用Jar包版本的外联平台实现与银行系统的交互,无需安装额外的客户端服务。手册的版本为V...

    建行龙支付下单模拟器脚本可模拟商户发起支付订单

    在IT行业中,建行龙支付下单模拟器脚本是一种用于测试和自动化支付流程的工具,主要服务于商户在对接中国建设银行的龙支付接口时进行功能验证和性能测试。这个脚本能够模拟真实的商户操作,无需实际交易即可完成支付...

    E店宝与各电商平台对接--条形码匹配关系表

    7. **邮乐/ECShop2.7.2/分销王/优购/阿里巴巴/库巴/聚美优品/聚美海淘/趣天麦网/走秀/建行善融/ShopEx_general/V+/苏宁易购/口袋通/唯品会/美丽说/工商银行/蘑菇街/贝贝网/楚楚街/折800/口袋购物(微店)/微盟/微盟萌...

    商业银行如何对接长江经济带战略.pptx

    通过参与长江经济带的建设,银行不仅可以实现自身的业务增长,还能为推动中国经济的新一轮增长贡献力量。同时,应积极学习国际流域治理的成功经验,实现经济效益与环境保护的双赢,助力长江经济带成为国内乃至全球的...

    关于某县域对接多层次资本市场地思考.doc

    关于某县域对接多层次资本市场,这是当前县域经济发展中的一个重要议题。国家致力于构建多层次资本市场体系,旨在为不同发展阶段和规模的企业提供多样化的融资渠道,促进实体经济尤其是中小企业的发展。多层次资本...

    android 建行支付demo

    建行银行支付demo,集成了建行银行支付功能,内容很详细 建行银行支付demo,集成了建行银行支付功能,内容很详细

    建设银行高端客户答谢会活动执行方案.doc

    "建设银行高端客户答谢会活动执行方案" 以下是从给定的文件中生成的相关知识点: 1. 活动策划:本文档提供了一个完整的活动执行方案,包括活动名称、目的、时间、地点、内容、流程等详细信息。这项活动的目的是...

    nodejs调用建行互联网银企被扫支付接口加密及验签Demo+java封装jar包

    该java源代码将建行互联网银企被扫支付接口java版加密及验签Demo 封装成jar包,方便nodejs调用。 1.将建行Java版加密Demo打包成jar包:CCBParam.jar。并将jar包放到服务器的相应文件夹下。 2.根据订单号、金额、付款...

    新版建行B2B演示软件

    【新版建行B2B演示软件】是一款专为中国建设银行(建行)的企业客户设计的交互式演示系统,主要用于展示和体验IBS5.0_B2BDemo平台的功能与服务。这款软件旨在帮助企业在实际应用前,理解并熟悉B2B(Business-to-...

    建设银行高端客户答谢会活动执行方案_营销推广 沙龙运营 活动策划方案.doc

    【建设银行高端客户答谢会活动执行方案】是银行业务中一种重要的客户关系管理策略,旨在维护和增强与高端客户的紧密联系,提升品牌形象,优化客户服务体系,并推动业绩增长。活动以"睿智人生·幸福圆舞曲"为主题,...

    建行数字化经营优秀案例.docx

    【中国建设银行数字化经营优秀案例】反映了金融巨头如何利用互联网技术进行企业内部的数智化转型,提升培训效率和降低成本。在这个案例中,建行采用了保利威提供的“直播中台”和“直播云”解决方案,构建了全新的...

    浅议高职院校学分基准点与对接模块构成

    为了实现学分制的有效运作,高职院校需要建立一个基准点,即通过主框架的建设来实现学分的计算、考核、学制安排以及课程重修等配套办法的支撑。课程内容通常分为必修课和选修课两大类。必修课包括公共基础必修课和...

    建设银行对SM集团供应链的金融服务方案设计.docx

    总的来说,建设银行对SM集团的金融服务方案设计旨在构建一个以核心企业为中心,融合信息、物流、资金的高效金融生态系统,通过深度合作,实现银企双赢,促进整个供应链的健康发展。这不仅是银行业务创新的体现,也是...

    互联网+智慧银行金融平台建设综合解决方案.ppt

    互联网+智慧银行金融平台建设综合解决方案

    福建省建设银行“短信通”项目应用.doc

    此项目综合运用了移动通信技术、信息安全管理、客户关系管理等多个领域的知识,旨在打造一个高效、安全、灵活的移动信息化平台,以满足福建省建设银行的业务需求和市场竞争力提升。通过实施短信通项目,银行不仅可以...

Global site tag (gtag.js) - Google Analytics