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 相关文章推荐
如何分别全角和半角以避免乱码
Oct 09 PHP
自动生成文章摘要的代码[PHP 版本]
Mar 20 PHP
PHP求小于1000的所有水仙花数的代码
Jan 10 PHP
MySQL的FIND_IN_SET函数使用方法分享
Mar 27 PHP
php实现读取超大文件的方法
Jul 28 PHP
php强制更新图片缓存的方法
Feb 11 PHP
Zend Framework开发入门经典教程
Mar 23 PHP
Thinkphp实现短信验证注册功能
Oct 18 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
Nov 25 PHP
PHP正则删除HTML代码中宽高样式的方法
Jun 12 PHP
laravel框架创建授权策略实例分析
Nov 22 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
Dec 02 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中拷贝构造函数、赋值运算符重载
2012/07/25 PHP
PHP限制页面只能在微信自带浏览器访问的代码
2014/01/15 PHP
yii实现图片上传及缩略图生成的方法
2014/12/04 PHP
[原创]php获取数组中键值最大数组项的索引值
2015/03/17 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
用Javascript读取中文COOKIE的解决办法
2007/02/15 Javascript
CSS+jQuery实现的一个放大缩小动画效果
2013/09/24 Javascript
jquery.validate的使用说明介绍
2013/11/12 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
js document.write()使用介绍
2014/02/21 Javascript
JS动态创建DOM元素的方法
2015/06/09 Javascript
JavaScript位移运算符(无符号) &gt;&gt;&gt; 三个大于号 的使用方法详解
2016/03/31 Javascript
js简单判断flash是否加载完成的方法
2016/06/21 Javascript
AngularJs验证重复密码的方法(两种)
2016/11/25 Javascript
ES6正则表达式的一些新功能总结
2017/05/09 Javascript
详解VUE中v-bind的基本用法
2017/07/13 Javascript
webpack打包node.js后端项目的方法
2018/03/10 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
npm qs模块使用详解
2020/02/07 Javascript
用python代码做configure文件
2014/07/20 Python
简单掌握Python的Collections模块中counter结构的用法
2016/07/07 Python
python numpy中cumsum的用法详解
2019/10/17 Python
详解pandas获取Dataframe元素值的几种方法
2020/06/14 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
Omio法国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/13 全球购物
Engel & Bengel官网:婴儿推车、儿童房家具和婴儿设备
2019/12/28 全球购物
美国在线家具网站:GDFStudio
2021/03/13 全球购物
小学教师的自我评价范例
2013/10/31 职场文书
GMP办公室主任岗位职责
2014/03/14 职场文书
交通工程专业推荐信
2014/09/06 职场文书
基层党组织建设整改方案
2014/09/16 职场文书
2014年保育员工作总结
2014/12/02 职场文书
2014年园林绿化工作总结
2014/12/11 职场文书
公司酒会主持词
2015/07/02 职场文书
财产分割协议书
2016/03/22 职场文书
python之np.argmax()及对axis=0或者1的理解
2021/06/02 Python