浅谈PHP SHA1withRSA加密生成签名及验签


Posted in PHP onMarch 18, 2019

最近公司对接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 值¬ifyUrl=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 相关文章推荐
一个域名查询的程序
Oct 09 PHP
开发大型 PHP 项目的方法
Jan 02 PHP
php实现的简单压缩英文字符串的代码
Apr 24 PHP
PHP 日期时间函数的高级应用技巧
Oct 10 PHP
php printf输出格式使用说明
Dec 05 PHP
PHP利用str_replace防注入的方法
Nov 10 PHP
yii数据库的查询方法
Dec 28 PHP
PHP进程通信基础之信号量与共享内存通信
Feb 19 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 PHP
Ubuntu上安装yaf扩展的方法
Jan 29 PHP
yii2 开发api接口时优雅的处理全局异常的方法
May 14 PHP
php获取是星期几的的一些常用姿势
Dec 15 PHP
PHP自动生成缩略图函数的源码示例
Mar 18 #PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
Mar 18 #PHP
PHP实现对数字分隔加千分号的方法
Mar 18 #PHP
PHP生成指定范围内的N个不重复的随机数
Mar 18 #PHP
PHP中十六进制颜色与RGB颜色值互转的方法
Mar 18 #PHP
PHP将整数数字转换为罗马数字实例分享
Mar 17 #PHP
PHP标准库(PHP SPL)详解
Mar 16 #PHP
You might like
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
2014/08/18 PHP
php通过smtp邮件验证登陆的方法
2016/05/11 PHP
详谈php静态方法及普通方法的区别
2016/10/04 PHP
PHP实现Session入库/存入redis的方法
2017/05/04 PHP
Yii2框架数据验证操作实例详解
2018/05/02 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题
2007/01/09 Javascript
javascript 写类方式之七
2009/07/05 Javascript
深入理解JavaScript系列(1) 编写高质量JavaScript代码的基本要点
2012/01/15 Javascript
jQueryUI写一个调整分类的拖放效果实现代码
2012/05/10 Javascript
html a标签-超链接中confirm方法使用介绍
2013/01/04 Javascript
jQuery回调函数的定义及用法实例
2014/12/23 Javascript
js获取Get值的方法
2016/09/29 Javascript
浅谈Angular的$q, defer, promise
2016/12/20 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
JS作用域链详解
2017/06/26 Javascript
微信小程序中实现手指缩放图片的示例代码
2018/03/13 Javascript
vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
2018/07/12 Javascript
vue中template的三种写法示例
2020/10/21 Javascript
微信小程序实现多行文字滚动
2020/11/18 Javascript
小米5s微信跳一跳小程序python源码
2018/01/08 Python
python爬虫之xpath的基本使用详解
2018/04/18 Python
win10环境下配置vscode python开发环境的教程详解
2019/10/16 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
2020/02/11 Python
关于Python turtle库使用时坐标的确定方法
2020/03/19 Python
Python Scrapy图片爬取原理及代码实例
2020/06/12 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
单身旅行者的单身假期:Just You
2018/04/08 全球购物
HomeAway英国:全球领先的度假租赁在线市场
2020/02/03 全球购物
医大实习自我鉴定
2013/12/07 职场文书
服装厂厂长岗位职责
2013/12/27 职场文书
乡镇干部十八大感言
2014/02/17 职场文书
教师职位说明书
2014/07/29 职场文书
超详细教你怎么升级Mysql的版本
2021/05/19 MySQL
CSS3中Animation实现简单的手指点击动画的示例
2021/07/15 HTML / CSS
Oracle删除归档日志及添加定时任务
2022/06/28 Oracle