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生成EXCEL的东东
Oct 09 PHP
利用static实现表格的颜色隔行显示
Oct 09 PHP
PHP 配置文件中open_basedir选项作用
Jul 19 PHP
php xml留言板 xml存储数据的简单例子
Aug 24 PHP
使用NetBeans + Xdebug调试PHP程序的方法
Apr 12 PHP
深入掌握include_once与require_once的区别
Jun 17 PHP
ThinkPHP关于session的操作方法汇总
Jul 18 PHP
配置php.ini实现PHP文件上传功能
Nov 27 PHP
PHP简单实现二维数组的矩阵转置操作示例
Nov 24 PHP
Laravel框架路由和控制器的绑定操作方法
Jun 12 PHP
Swoole 5将移除自动添加Event::wait()特性详解
Jul 10 PHP
tp5.1框架数据库子查询操作实例分析
May 26 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
ThinkPHP进程计数类Process用法实例详解
2015/09/25 PHP
浅析php静态方法与非静态方法的用法区别
2016/05/17 PHP
PHP实现数组根据某个字段进行水平合并,横向合并案例分析
2019/10/08 PHP
前端开发必须知道的JS之原型和继承
2010/07/06 Javascript
解决Jquery向页面append新元素之后事件的绑定问题
2015/03/16 Javascript
javascript解决IE6下hover问题的方法
2015/07/28 Javascript
浅析JavaScript声明变量
2015/12/21 Javascript
js省市县三级联动效果实例
2020/04/15 Javascript
禁用backspace网页回退功能的实现代码
2016/11/15 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
2017/03/13 Javascript
深入浅出理解JavaScript闭包的功能与用法
2018/08/01 Javascript
关于JSON解析的实现过程解析
2019/10/08 Javascript
浅谈Vue.use到底是什么鬼
2020/01/21 Javascript
Vue性能优化的方法
2020/07/30 Javascript
解决ant Design中Select设置initialValue时的大坑
2020/10/29 Javascript
python 输出一个两行字符的变量
2009/02/05 Python
Python 实现数据库(SQL)更新脚本的生成方法
2017/07/09 Python
python如何为被装饰的函数保留元数据
2018/03/21 Python
python 自定义异常和异常捕捉的方法
2018/10/18 Python
python使用pyecharts库画地图数据可视化的实现
2020/03/25 Python
python输出数学符号实例
2020/05/11 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
python读取图片颜色值并生成excel像素画的方法实例
2021/02/19 Python
CSS3 网页下拉菜单代码解释 中文翻译
2010/02/27 HTML / CSS
详解HTML5中CSS外观属性
2020/09/10 HTML / CSS
Artist Guitars新西兰:乐器在线商店
2017/09/17 全球购物
FC-Moto西班牙:摩托车手最大的购物场所之一
2019/04/11 全球购物
Java软件工程师综合面试题笔试题
2013/09/08 面试题
学生请假条
2014/04/11 职场文书
研究生求职自荐书
2014/06/23 职场文书
公司保洁员管理制度
2015/08/04 职场文书
面试必问:圣杯布局和双飞翼布局的区别
2021/05/13 HTML / CSS
2021好看的国漫排行榜前十名 《完美世界》上榜,《元龙》排名第一
2022/03/18 国漫
「约定的梦幻岛」作画发布诺曼生日新绘
2022/03/21 日漫
《勇者辞职不干了》上卷BD发售宣传CM公开
2022/04/08 日漫
避坑之 JavaScript 中的toFixed()和正则表达式
2022/04/19 Javascript