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防注入代码
Apr 07 PHP
PHP 金额数字转换成英文
May 06 PHP
新浪微博API开发简介之用户授权(PHP基础篇)
Sep 25 PHP
PHP在不同页面间传递Json数据示例代码
Jun 08 PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
Jun 29 PHP
PHP MSSQL 分页实例
Apr 13 PHP
Yii框架中jquery表单验证插件用法示例
Oct 18 PHP
Yii2中添加全局函数的方法分析
May 04 PHP
php使用ftp实现文件上传与下载功能
Jul 21 PHP
Yii框架 session 数据库存储操作方法示例
Nov 18 PHP
PHP sdk文档处理常用代码示例解析
Dec 09 PHP
PHP7新特性
Mar 09 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时间戳使用实例代码
2008/06/07 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
2019/04/02 PHP
CL vs ForZe BO5 第三场 2.13
2021/03/10 DOTA
JQuery扩展插件Validate 3通过参数设置错误信息
2011/09/05 Javascript
javascript的offset、client、scroll使用方法详解
2012/12/25 Javascript
Node.js的包详细介绍
2015/01/14 Javascript
在JavaScript中操作时间之getUTCDate()方法的使用
2015/06/10 Javascript
微信小程序 获取相册照片实例详解
2016/11/16 Javascript
angular 动态组件类型详解(四种组件类型)
2017/02/22 Javascript
解决option标签selected=&quot;selected&quot;属性失效的问题
2017/11/06 Javascript
jQuery中实现text()的方法
2019/04/04 jQuery
python实现巡检系统(solaris)示例
2014/04/02 Python
Python使用当前时间、随机数产生一个唯一数字的方法
2017/09/18 Python
Python使用三种方法实现PCA算法
2017/12/12 Python
Python Pandas批量读取csv文件到dataframe的方法
2018/10/08 Python
python实现从pdf文件中提取文本,并自动翻译的方法
2018/11/28 Python
python3安装speech语音模块的方法
2018/12/24 Python
pyQT5 实现窗体之间传值的示例
2019/06/20 Python
python提取log文件内容并画出图表
2019/07/08 Python
Form表单及django的form表单的补充
2019/07/25 Python
如何使用Python脚本实现文件拷贝
2019/11/20 Python
如何在django中添加日志功能
2020/02/06 Python
matlab、python中矩阵的互相导入导出方式
2020/06/01 Python
Python小白学习爬虫常用请求报头
2020/06/03 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
2020/06/04 Python
python xlsxwriter模块的使用
2020/12/24 Python
UGG美国官网:购买UGG雪地靴、拖鞋和鞋子
2017/12/31 全球购物
德国网上超市:myTime.de
2019/08/26 全球购物
如何写一个自定义标签
2012/12/28 面试题
电大会计学自我鉴定
2014/02/06 职场文书
运动会入场词50字
2014/02/20 职场文书
厨师长岗位职责
2014/03/02 职场文书
合作协议书范本
2014/04/17 职场文书
政府门卫岗位职责
2014/04/29 职场文书
中学生自我评价范文
2015/03/03 职场文书
2019年大学毕业生个人自我鉴定范文大全
2019/03/21 职场文书