php 生成签名及验证签名详解


Posted in PHP onOctober 26, 2016

php 生成签名及验证签名

<?php
  /**
   * 根据原文生成签名内容
   *
   * @param string $data 原文内容
   *
   * @return string
   * @author confu
   */
  function sign($data)
  {
    $filePath = 'test.p12';
    if(!file_exists($filePath)) {
      return false;
    }
 
    $pkcs12 = file_get_contents($filePath);
    if (openssl_pkcs12_read($pkcs12, $certs, '读取证书所需要的密码')) {
      $privateKey = $certs['pkey']; //根据实际情况键值可能不同
      $publicKey = $certs['cert']; //根据实际情况键值可能不同
      $binary_signature = "";
      if (openssl_sign($data, $binarySignature, $privateKey, OPENSSL_ALGO_SHA1)) {
        return $binarySignature;
      } else {
        return '';
      }
    } else {
      return '';
    }
  }
 
  /**
   * 验证签名自己生成的是否正确
   *
   * @param string $data 签名的原文
   * @param string $signature 签名
   *
   * @return bool
   * @author confu
   */
  function verifySign($data, $signature)
  {
    $filePath = 'test.p12';
    if(!file_exists($filePath)) {
      return false;
    }
 
    $pkcs12 = file_get_contents($filePath);
    if (openssl_pkcs12_read($pkcs12, $certs, '读取证书所需要的密码')) {
      $publicKey = $certs['cert'];
      $ok = openssl_verify($data, $signature, $publicKey);
      if ($ok == 1) {
        return true;
      }
    }
    return false;
  }
 
  /**
   * 验证返回的签名是否正确
   *
   * @param string $data 要验证的签名原文
   * @param string $signature 签名内容
   *
   * @return bool
   * @author confu
   */
  function verifyRespondSign($data, $signature)
  {
    $filePath = 'allinpay-pds.pem';
    if(!file_exists($filePath)) {
      return false;
    }
 
    $fp = fopen($filePath, "r");
    $cert = fread($fp, 8192);
    fclose($fp);
    $pubkeyid = openssl_get_publickey($cert);
 
    if(!is_resource($pubkeyid)) {
      return false;
    }
 
    $ok = openssl_verify($data, $signature, $pubkeyid);
    if ($ok == 1) {
      openssl_free_key($pubkeyid);
      return true;
    }
    return false;
  }
?>

 openssl_sign 默认signature_alg参数是OPENSSL_ALGO_SHA1

如果使用DSA加密方式需要使用OPENSSL_ALGO_DSS1参数

signature_alg 其他参数

OPENSSL_ALGO_DSS1 (integer)

OPENSSL_ALGO_SHA1 (integer)

OPENSSL_ALGO_SHA224 (integer)

OPENSSL_ALGO_SHA256 (integer)

OPENSSL_ALGO_SHA384 (integer)

OPENSSL_ALGO_SHA512 (integer)

OPENSSL_ALGO_RMD160 (integer)

OPENSSL_ALGO_MD5 (integer)

OPENSSL_ALGO_MD4 (integer)

OPENSSL_ALGO_MD2 (integer)

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

PHP 相关文章推荐
PHP编程之高级技巧——利用Mysql函数
Oct 09 PHP
PHP垃圾回收机制简单说明
Jul 22 PHP
使用php统计字符串中中英文字符的个数
Jun 23 PHP
ThinkPHP学习笔记(一)ThinkPHP部署
Jun 22 PHP
CodeIgniter配置之database.php用法实例分析
Jan 20 PHP
PHP中__autoload和Smarty冲突的简单解决方法
Apr 08 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
Oct 08 PHP
php对xml文件的增删改查操作实现方法分析
May 19 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
Jul 04 PHP
作为PHP程序员你要知道的另外一种日志
Jul 30 PHP
PHP多进程简单实例小结
Nov 09 PHP
php的RSA加密解密算法原理与用法分析
Jan 23 PHP
PHP XML和数组互相转换详解
Oct 26 #PHP
PHP对XML内容进行修改和删除实例代码
Oct 26 #PHP
php array_merge_recursive 数组合并
Oct 26 #PHP
php抛出异常与捕捉特定类型的异常详解
Oct 26 #PHP
php array_map使用自定义的函数处理数组中的每个值
Oct 26 #PHP
AES加解密在php接口请求过程中的应用示例
Oct 26 #PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
Oct 25 #PHP
You might like
php自动加载的两种实现方法
2010/06/21 PHP
php利用腾讯ip分享计划获取地理位置示例分享
2014/01/20 PHP
php+ajax实现图片文件上传功能实例
2014/06/17 PHP
Yii2框架BootStrap样式的深入理解
2016/11/07 PHP
Smarty模板常见的简单应用分析
2016/11/15 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
2019/05/29 PHP
Javascript hasOwnProperty 方法 &amp; in 关键字
2008/11/26 Javascript
Jquery replace 字符替换实现代码
2010/12/02 Javascript
Jquery实现弹出层分享微博插件具备动画效果
2013/04/03 Javascript
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
2013/05/07 Javascript
js实现文本框宽度自适应文本宽度的方法
2015/08/13 Javascript
javascript实现计时器的简单方法
2016/02/21 Javascript
微信小程序 form组件详解
2016/10/25 Javascript
微信小程序 wx.request(接口调用方式)详解及实例
2016/11/23 Javascript
学习vue.js条件渲染
2016/12/03 Javascript
DropDownList实现可输入可选择(两种版本可选)
2016/12/07 Javascript
使用bootstraptable插件实现表格记录的查询、分页、排序操作
2017/08/06 Javascript
在一般处理程序(ashx)中弹出js提示语
2017/08/16 Javascript
Vue.js组件间的循环引用方法示例
2017/12/27 Javascript
vue组件实现弹出框点击显示隐藏效果
2020/10/26 Javascript
Webpack之tree-starking 解析
2018/09/11 Javascript
使用webpack构建应用的方法步骤
2019/03/04 Javascript
如何阻止移动端浏览器点击图片浏览
2020/08/29 Javascript
js 图片懒加载的实现
2020/10/21 Javascript
python fabric使用笔记
2015/05/09 Python
python OpenCV学习笔记直方图反向投影的实现
2018/02/07 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
python3实现往mysql中插入datetime类型的数据
2020/03/02 Python
web页面录屏实现
2019/02/12 HTML / CSS
一级方程式赛车官方网上商店:F1 Store(支持中文)
2018/01/12 全球购物
100%羊绒:NakedCashmere
2020/08/26 全球购物
自荐信模版
2013/10/24 职场文书
电子商务专业自我鉴定
2013/12/18 职场文书
就业协议书范本
2014/04/11 职场文书
学习普通话的体会
2014/11/07 职场文书
入党转正介绍人意见
2015/06/03 职场文书