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应用程序来获取Web服务器的状态信息
Oct 09 PHP
dedecms采集中可以过滤多行代码的正则表达式
Mar 17 PHP
PHP iconv 函数转gb2312的bug解决方法
Oct 11 PHP
PHP开启gzip页面压缩实例代码
Mar 11 PHP
php数组函数序列 之shuffle()和array_rand() 随机函数使用介绍
Oct 29 PHP
PHP解码unicode编码的中文字符代码分享
Aug 13 PHP
简单的php+mysql聊天室实现方法(附源码)
Jan 05 PHP
浅析Yii2中GridView常见操作
Apr 22 PHP
配置Nginx+PHP的正确思路与过程
May 10 PHP
探究Laravel使用env函数读取环境变量为null的问题
Dec 06 PHP
PHP实现的Redis多库选择功能单例类
Jul 27 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
May 23 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/09/14 PHP
PHP过滤黑名单关键字的方法
2014/12/01 PHP
PHP队列场景以及实现代码实例详解
2021/02/26 PHP
JS 用6N±1法求素数 实例教程
2009/10/20 Javascript
JQuery 拾色器插件发布-jquery.icolor.js
2010/10/20 Javascript
工作需要写的一个js拖拽组件
2011/07/28 Javascript
js实现的捐赠管理完整实例
2015/01/20 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
2015/08/06 Javascript
js实现简单的联动菜单效果
2015/08/19 Javascript
js实现Select列表内容自动滚动效果代码
2015/08/20 Javascript
Javascript HTML5 Canvas实现的一个画板
2020/04/12 Javascript
Vue渲染函数详解
2017/09/15 Javascript
vuex的简单使用教程
2018/02/02 Javascript
基于JS实现html中placeholder属性提示文字效果示例
2018/04/19 Javascript
微信小程序url传参写变量的方法
2018/08/09 Javascript
Vue 封装防刷新考试倒计时组件的实现
2020/06/05 Javascript
解决element-ui的下拉框有值却无法选中的情况
2020/11/07 Javascript
[02:32]DOTA2英雄基础教程 祸乱之源
2013/12/23 DOTA
Python切片操作深入详解
2018/07/27 Python
对python 多个分隔符split 的实例详解
2018/12/20 Python
Pandas统计重复的列里面的值方法
2019/01/30 Python
Python何时应该使用Lambda函数
2019/07/02 Python
Python有参函数使用代码实例
2020/01/06 Python
python TCP包注入方式
2020/05/05 Python
keras K.function获取某层的输出操作
2020/06/29 Python
python 进程池pool使用详解
2020/10/15 Python
Html5实现移动端、PC端 刮刮卡效果
2016/06/30 HTML / CSS
Html5 APP中监听返回事件处理的方法示例
2018/03/15 HTML / CSS
Michael Kors香港官网:美国奢侈品品牌
2019/12/26 全球购物
破坏寝室公物检讨书
2014/11/17 职场文书
餐厅服务员岗位职责
2015/02/09 职场文书
2016小学教师读书心得体会
2016/01/13 职场文书
详解mysql三值逻辑与NULL
2021/05/19 MySQL
Java实现多文件上传功能
2021/06/30 Java/Android
JS中forEach()、map()、every()、some()和filter()的用法
2022/05/11 Javascript