最近公司对接XX第三方支付平台的代付业务,由于对方公司只有JAVA的demo,所以只能根据文档自己整合PHP的签名加密,网上找过几个方法,踩到各种各样的坑,还好最后算是搞定了,话不多说,代码分享出来。

业务要求:每个签名组装的内容是按字段名的字典顺序升序排序连接的

先组装需要签名的内容:

     /**
* 拼接需要签名的内容
* Author: Tao.
*
* @param array $data 需签名的字段内容
*
* @return string
*/
public static function getSign($data)
{
foreach ($data as $k => $v) {
$Parameters[$k] = $v;
}
//按字典序排序参数
ksort($Parameters);
$sign = '';
foreach ($Parameters as $k => $v) {
$sign .= $k . "=" . $v . "&";
}
$sign = '&' . rtrim($sign, '&');
return $sign;
}

签名字符串如下示例:
&amount=amount 值&ccy=ccy 值 &merchantId=merchantId 值&notifyUrl=notifyUrl 值&orderId=orderId 值 &payeeAcctNo=payeeAcctNo 值(明文)。

要注意的是,根据业务需要选择,是否在签名内容前拼接 &符。

然后生成秘钥签名:

     /**
* 秘钥加密
* Author: Tao.
*
* @param string $data 之前生成好的需加密内容
* @param $key 私钥证书位置(.pfx文件)
* @param string $pwd 证书密码
*
* @return string
*/
public static function SHA1withRSA($data, $key,$pwd)
{
openssl_pkcs12_read(file_get_contents($key), $certs, $pwd);
if (!$certs) return;
$signature = '';
openssl_sign($data, $signature, $certs['pkey']);
return bin2hex($signature);
}

由于第三方公司要求转换使用16进制,可根据需求选择bin2hex()或base64_encode()。

这里要注意的是,根据业务需要,签名后的内容是否要求大小写敏感。

签名后的内容应该是小写的,可以使用strtoupper()转换成大写。

以上就是给大家整理好的私钥加密方法。

但此业务中另要求将银行卡号需要进行RSA公钥加密
以下是获取公钥的方法:
此处是获取对方平台证书的公钥(.cer文件)

     /**
* 获取公钥
* Author: Tao.
*
* @param $path //公钥证书位置 (.cer文件)
*
* @return mixed
* @throws \Exception
*/
public static function loadCert($path)
{
$file = file_get_contents($path);
if (!$file) {
throw new \Exception('loadx509Cert::file_get_contents ERROR');
} $cert = chunk_split(base64_encode($file), 64, "\n");
$cert = "-----BEGIN CERTIFICATE-----\n" . $cert . "-----END CERTIFICATE-----\n"; $res = openssl_pkey_get_public($cert);
$detail = openssl_pkey_get_details($res);
openssl_free_key($res); if (!$detail) {
throw new \Exception('loadX509Cert::openssl_pkey_get_details ERROR');
}
return $detail['key'];
} /**
* 公钥加密
* Author: Tao.
*
* @param $pubPath //公钥证书位置 (.cer文件)
* @param string $bankCode //银行卡号
*
* @return string
*/
public static function rsa_encode($bankCode,$pubPath)
{
$pubkey = self::loadCert($pubPath);
$encrypt_data = '';
openssl_public_encrypt($bankCode, $encrypt_data, $pubkey);
$encrypt_data = base64_encode($encrypt_data);
return $encrypt_data;
}

你要问我为什么私钥是bin2hex(),公钥换了base64_encode()。我也不知道为什么,问过说是16位,但是请求签名一直失败,换了64成功了。对方说文档太老了,忘记了。。根据需要选择吧

最后回调结果验签

首先先将回调数据中组装签名字段的内容取出来,按上面的getSign()方法排序。
然后进行验证:

     /**
* 验证返回的签名是否正确
*
* @param string $data 要验证的签名原文
* @param string $signature 签名内容
*@param $pubPath 公钥证书位置 (.cer文件)
*
* @return bool
*/
public static function verifyRespondSign($data, $signature,$pubPath)
{
$keys = self::loadCert($pubPath);
$signature = hex2bin($signature);
$ok = openssl_verify($data, $signature, $keys);
if ($ok == 1) {
return true;
}
return false;
}

以上就是PHP SHA1withRSA加密、签名及验签的全部内容了。

希望对各位有帮助。
有不对的地方请指出,及时修改,互相学习。

PHP SHA1withRSA加密生成签名及验签的更多相关文章

  1. C#通过安全证书生成签名和验签辅助类

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...

  2. 使用非对称算法RSA实现加解密和使用签名算法SHA1WithRSA、MD5withRSA生成签名以及验签

    不啰嗦,直接上源码 package com.hudai.platform.manager.util; import java.io.ByteArrayOutputStream; import java ...

  3. erlang的RSA签名与验签

    1.RSA介绍 RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对 其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而 ...

  4. 密码基础知识(2)以RSA为例说明加密、解密、签名、验签

    密码基础知识(1)https://www.cnblogs.com/xdyixia/p/11528572.html 一.RSA加密简介 RSA加密是一种非对称加密.是由一对密钥来进行加解密的过程,分别称 ...

  5. 几个例子理解对称加密与非对称加密、公钥与私钥、签名与验签、数字证书、HTTPS加密方式

    # 原创,转载请留言联系 为什么会出现这么多加密啊,公钥私钥啊,签名啊这些东西呢?说到底还是保证双方通信的安全性与完整性.例如小明发一封表白邮件给小红,他总不希望给别人看见吧.而各种各样的技术就是为了 ...

  6. Delphi支付宝支付【支持SHA1WithRSA(RSA)和SHA256WithRSA(RSA2)签名与验签】

    作者QQ:(648437169) 点击下载➨Delphi支付宝支付             支付宝支付api文档 [Delphi支付宝支付]支持条码支付.扫码支付.交易查询.交易退款.退款查询.交易撤 ...

  7. Delphi RSA签名与验签【支持SHA1WithRSA(RSA1)、SHA256WithRSA(RSA2)和MD5WithRSA签名与验签】

    作者QQ:(648437169) 点击下载➨ RSA签名与验签 [delphi RSA签名与验签]支持3种方式签名与验签(SHA1WithRSA(RSA1).SHA256WithRSA(RSA2)和M ...

  8. RSA后台签名前台验签的应用(前台采用jsrsasign库)

    写在前面 安全测试需要, 为防止后台响应数据返给前台过程中被篡改前台再拿被篡改后的数据进行接下来的操作影响正常业务, 决定采用RSA对响应数据进行签名和验签, 于是有了这篇<RSA后台签名前台验 ...

  9. RSA/RSA2 进行签名和验签

    package com.byttersoft.hibernate.erp.szmy.util; import java.io.ByteArrayInputStream; import java.io. ...

随机推荐

  1. git 上传文件到仓库上提示:origin does not to be a git repository

    最近上传代码到GitHub的时候,当我输入 git push -u origin master的时候,它提示: origin does not to be a git repository 在网上找到 ...

  2. 树莓派发射FM波——搭建私人小电台

    树莓派的应用十分广泛,有很多奇思妙想的应用非常有趣,在这里我们想实现一个小电台的功能,但是在这里需要说明,私人架设电台是违法行为,所以本案只作为自我娱乐所用,不能发射大功率的信号干扰正常的FM频段. ...

  3. Oracle SQL_TRACE使用小结

    一.关于基础表Oc_COJ^c680758 rd-A6z/&[1R1] H680758 Oracle10G之前,启用AUTOTRACE功能需要手工创建plan_table表,创建脚本为$ORA ...

  4. nodejs lodash的一些函数

    1   _.compact用法   _.compact([0, 1, false, 2, '', 3,'mm']); var test = _.compact([-1,0, 1, false, 2, ...

  5. CSS深入理解之overflow(HTML/CSS)

    简介 overflow看上去其貌不扬,其中蕴含的知识点还是很多的,有很多鲜为人知的特性表现. overflow基本属性值 1.visible(默认) 2.hidden 3.scroll 4.auto ...

  6. MongoDB用户配置

    MongoDB学习笔记—权限管理 阅读目录 1.MongoDB权限介绍 2 MongoDB添加管理员账户 3 MongoDB开启用户权限验证 4 MongoDB的roles角色简单介绍 5 Mongo ...

  7. SQLServer中DataLength()和Len()两内置函数的区别

    最近工作中遇到了个问题:在数据库中声明字段类型时char(4),但实际只存储了‘DCE’三个字母,程序中拼装以该字段作为key的Map中,会把‘DCE’+空格作为其Key,这样造成用没加空格的‘DCE ...

  8. winform messagebox自动关闭

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. CSS学习摘要-数值和单位及颜色

    在CSS中,值的类型有很多种,一些很常见,一些你却几乎没怎么遇到过.我们不会在这篇文档中面面俱到地描述他们,而只是这些对于掌握CSS可能最有用处的这些.本文将会涉及如下CSS的值: 数值: 长度值,用 ...

  10. 清除 Exchange 2013/2016/2019 日志和ETL文件

    Exchange Server  的2个日志目录会增长的很快,需要定时清理,不然C盘的空间很快就会吃光,以下这个powershell脚本就是用于清理目录下面的日志的,已在生产环境中测试过,没问题: S ...