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程序之die调试法 快速解决错误
Sep 17 PHP
简单的方法让你的后台登录更加安全(php中加session验证)
Aug 22 PHP
PHP中header和session_start前不能有输出原因分析
Jan 11 PHP
ThinkPHP添加更新标签的方法
Dec 05 PHP
php下Memcached入门实例解析
Jan 05 PHP
PHP常用工具类大全附全部代码下载
Dec 07 PHP
详解WordPress开发中的get_post与get_posts函数使用
Jan 04 PHP
PHP实现数据分页显示的简单实例
May 26 PHP
php编译安装php-amq扩展简明教程
Jun 25 PHP
解决laravel(5.5)访问public报错的问题
Oct 12 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
May 02 PHP
PHP与Web页面交互操作实例分析
Jun 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模拟HTTP认证
2006/10/09 PHP
一个目录遍历函数
2006/10/09 PHP
基于mysql的bbs设计(二)
2006/10/09 PHP
php设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
php生成N个不重复的随机数实例
2013/11/12 PHP
PHP模拟asp中response类实现方法
2015/08/08 PHP
PHP微信开发之查询城市天气
2016/06/23 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
详解json在php中的应用
2018/09/30 PHP
javascript 对象定义方法 简单易学
2009/03/22 Javascript
Extjs4中的分页应用结合前后台
2013/12/13 Javascript
写出高效jquery代码的19条指南
2014/03/19 Javascript
基于Vue.js实现数字拼图游戏
2016/08/02 Javascript
js 博客内容进度插件详解
2017/02/19 Javascript
AngularJS中使用ngModal模态框实例
2017/05/27 Javascript
Scala解析Json字符串的实例详解
2017/10/11 Javascript
vue jsx 使用指南及vue.js 使用jsx语法的方法
2017/11/11 Javascript
VueJs监听window.resize方法示例
2018/01/17 Javascript
Express的HTTP重定向到HTTPS的方法
2018/06/06 Javascript
JS实现横向跑马灯效果代码
2020/04/20 Javascript
微信小程序实现电子签名并导出图片
2020/05/27 Javascript
pyshp创建shp点文件的方法
2018/12/31 Python
Python 进程之间共享数据(全局变量)的方法
2019/07/16 Python
python输入错误后删除的方法
2019/10/12 Python
python中的TCP(传输控制协议)用法实例分析
2019/11/15 Python
python飞机大战pygame碰撞检测实现方法分析
2019/12/17 Python
python代码xml转txt实例
2020/03/10 Python
实例讲解Python 迭代器与生成器
2020/07/08 Python
英国最大的在线奢侈手表零售商:Jura Watches
2018/01/29 全球购物
公司授权委托书
2014/10/17 职场文书
2016元旦主持人开场白
2015/12/03 职场文书
党章学习心得体会2016
2016/01/14 职场文书
幼儿园大班教师评语
2019/06/21 职场文书
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript
一文搞懂PHP中的抽象类和接口
2022/05/25 PHP