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 rand()造成CPU 100%的解决办法
May 18 PHP
如何在Ubuntu下启动Apache的Rewrite功能
Jul 05 PHP
php页码形式分页函数支持静态化地址及ajax分页
Mar 28 PHP
php.ini save_handler 修改不生效的解决办法
Jul 22 PHP
PHP定时任务延缓执行的实现
Oct 08 PHP
服务器上配置PHP运行环境教程
Feb 12 PHP
php获取文件类型和文件信息的方法
Jul 10 PHP
php对文件夹进行相关操作(遍历、计算大小)
Nov 04 PHP
PHP可变函数学习小结
Nov 29 PHP
php求今天、昨天、明天时间戳的简单实现方法
Jul 28 PHP
Thinkphp连表查询及数据导出方法示例
Oct 15 PHP
让whoops帮我们告别ThinkPHP6的异常页面
Mar 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
受疫情影响 动画《Re从零开始的异世界生活》第二季延期至7月
2020/03/10 日漫
PHP define函数的使用说明
2008/08/27 PHP
php中取得文件的后缀名?
2012/02/20 PHP
php使用curl获取https请求的方法
2015/02/11 PHP
laravel5创建service provider和facade的方法详解
2016/07/26 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
jQuery前台数据获取实现代码
2011/03/16 Javascript
javascript抖动元素的小例子
2013/10/28 Javascript
JavaScript中跨域调用Flash的方法
2014/08/11 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
2014/10/16 Javascript
使用jQuery在移动页面上添加按钮和给按钮添加图标
2015/12/04 Javascript
jQuery解析json格式数据简单实例
2016/01/22 Javascript
jquery获取文档高度和窗口高度汇总
2016/01/25 Javascript
vue-quill-editor实现图片上传功能
2017/08/08 Javascript
Vue2.0+ElementUI实现表格翻页的实例
2017/10/23 Javascript
详解实现一个通用的“划词高亮”在线笔记功能
2019/04/23 Javascript
JQuery属性操作与循环用法示例
2019/05/15 jQuery
Element-ui中元素滚动时el-option超出元素区域的问题
2019/05/30 Javascript
Vue.js中的extend绑定节点并显示的方法
2019/06/20 Javascript
vue下的@change事件的实现
2019/10/25 Javascript
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
python编写的最短路径算法
2015/03/25 Python
python实现比较两段文本不同之处的方法
2015/05/30 Python
tensorflow实现简单逻辑回归
2018/09/07 Python
对python:循环定义多个变量的实例详解
2019/01/20 Python
python实现扫描局域网指定网段ip的方法
2019/04/16 Python
Python坐标线性插值应用实现
2019/11/13 Python
Silk Therapeutics官网:清洁、抗衰老护肤品
2020/08/12 全球购物
历史学专业大学生找工作的自我评价
2013/10/16 职场文书
女大学生自我鉴定
2013/12/09 职场文书
“向国旗敬礼”主题班会活动设计方案
2014/09/27 职场文书
教学改革问题查摆整改措施
2014/09/27 职场文书
民间借贷借条如何写
2015/05/26 职场文书
趣味运动会赞词
2015/07/22 职场文书
2016年党员读书月活动总结
2016/04/06 职场文书