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 相关文章推荐
PHPlet在Windows下的安装
Oct 09 PHP
php类
Nov 27 PHP
通过具体程序来理解PHP里面的抽象类
Jan 28 PHP
PHP自动选择 连接本地还是远程数据库
Dec 02 PHP
php读取flash文件高宽帧数背景颜色的方法
Jan 06 PHP
PHP封装的字符串加密解密函数
Dec 18 PHP
php连接oracle数据库的方法(测试成功)
May 26 PHP
PHP下 Mongodb 连接远程数据库的实例代码
Aug 30 PHP
thinkPHP框架自动填充原理与用法分析
Apr 03 PHP
ThinkPHP5.1表单令牌Token失效问题的解决
Mar 22 PHP
使用composer 安装 laravel框架的方法图文详解
Aug 02 PHP
Laravel5.5 动态切换多语言的操作方式
Oct 25 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目录函数实现创建、读取目录教程实例
2011/01/13 PHP
PHP 观察者模式的实现代码
2013/05/10 PHP
PHP创建桌面快捷方式的实例代码
2014/02/17 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
将nodejs打包工具整合到鼠标右键的方法
2013/05/11 NodeJs
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
2013/12/05 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
2014/05/15 Javascript
jQuery.holdReady()使用方法
2014/05/20 Javascript
js实现圆盘记速表
2015/08/03 Javascript
原生js实现addClass,removeClass,hasClass方法
2016/04/27 Javascript
js实现滑动到页面底部自动加载更多功能
2017/02/15 Javascript
详解基于vue的移动web app页面缓存解决方案
2017/08/03 Javascript
史上最为详细的javascript继承(推荐)
2019/05/18 Javascript
vue中使用[provide/inject]实现页面reload的方法
2019/09/30 Javascript
从零学python系列之从文件读取和保存数据
2014/05/23 Python
探索Python3.4中新引入的asyncio模块
2015/04/08 Python
基于python实现的抓取腾讯视频所有电影的爬虫
2016/04/22 Python
Python中使用支持向量机SVM实践
2017/12/27 Python
深入浅析Python传值与传址
2018/07/10 Python
利用python提取wav文件的mfcc方法
2019/01/09 Python
python使用PIL实现多张图片垂直合并
2019/01/15 Python
Python多线程处理实例详解【单进程/多进程】
2019/01/30 Python
python 猴子补丁(monkey patch)
2019/06/26 Python
django使用django-apscheduler 实现定时任务的例子
2019/07/20 Python
Python属性和内建属性实例解析
2020/01/14 Python
flask开启多线程的具体方法
2020/08/02 Python
SheIn沙特阿拉伯:女装在线
2020/03/23 全球购物
大学生就业自荐信
2013/10/26 职场文书
运动会广播稿200字
2014/01/15 职场文书
抗洪抢险事迹材料
2014/05/06 职场文书
中文专业求职信
2014/06/20 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
使用GO语言实现Mysql数据库CURD的简单示例
2021/08/07 Golang
Win10 最新稳定版本 21H2开始推送
2022/04/19 数码科技