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 相关文章推荐
第八节 访问方式 [8]
Oct 09 PHP
php mysql Errcode: 28 终极解决方法
Jul 01 PHP
PHP初学者最感迷茫的问题小结
Mar 27 PHP
解析如何修改phpmyadmin中的默认登陆超时时间
Jun 25 PHP
如何给phpcms v9增加类似于phpcms 2008中的关键词表
Jul 01 PHP
thinkphp备份数据库的方法分享
Jan 04 PHP
php下Memcached入门实例解析
Jan 05 PHP
PHPExcel简单读取excel文件示例
May 26 PHP
Zend Framework实现自定义过滤器的方法
Dec 09 PHP
Thinkphp实现站点静态化的方法详解
Mar 21 PHP
Laravel 登录后清空COOKIE的操作方法
Oct 14 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
Nov 24 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
全国FM电台频率大全 - 6 辽宁省
2020/03/11 无线电
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
Yii2框架实现登录、退出及自动登录功能的方法详解
2017/10/24 PHP
Convert Seconds To Hours
2007/06/16 Javascript
一实用的实现table排序的Javascript类库
2007/09/12 Javascript
Javascript调用C#代码
2011/01/17 Javascript
深入探密Javascript数组方法
2015/01/08 Javascript
javascript中this的四种用法
2015/05/11 Javascript
javascript中动态函数用法实例分析
2015/05/14 Javascript
浅谈js中子页面父页面方法 变量相互调用
2016/08/04 Javascript
基于JavaScript实现跳转提示页面
2016/09/24 Javascript
jquery广告无缝轮播实例
2017/01/05 Javascript
JS实现加载和读取XML文件的方法详解
2017/04/24 Javascript
基于react组件之间的参数传递(详解)
2017/09/05 Javascript
基于vue+canvas的excel-like组件实例详解
2017/11/28 Javascript
Vue列表循环从指定下标开始的多种解决方案
2020/04/08 Javascript
python实现每次处理一个字符的三种方法
2014/10/09 Python
Python语言描述最大连续子序列和
2017/12/05 Python
使用python为mysql实现restful接口
2018/01/05 Python
python:print格式化输出到文件的实例
2018/05/14 Python
flask框架路由常用定义方式总结
2019/07/23 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
Python数据相关系数矩阵和热力图轻松实现教程
2020/06/16 Python
使用Nibabel库对nii格式图像的读写操作
2020/07/01 Python
HTML5录音实践总结(Preact)
2020/05/07 HTML / CSS
Clarks西班牙官方在线商店:clarks鞋
2019/05/03 全球购物
法国春天百货官网:Printemps.com
2020/06/29 全球购物
经典大学生求职信范文
2014/01/06 职场文书
社区活动邀请函范文
2014/01/29 职场文书
励志演讲稿范文
2014/04/29 职场文书
2014年幼儿园园长工作总结
2014/12/17 职场文书
公司处罚决定书
2015/06/24 职场文书
Python趣味爬虫之用Python实现智慧校园一键评教
2021/05/28 Python
Python scrapy爬取起点中文网小说榜单
2021/06/13 Python
前端vue+express实现文件的上传下载示例
2022/02/18 Vue.js
Go语言编译原理之源码调试
2022/08/05 Golang