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 相关文章推荐
桌面中心(四)数据显示
Oct 09 PHP
php-accelerator网站加速PHP缓冲的方法
Jul 30 PHP
php抓取页面与代码解析 推荐
Jul 23 PHP
php继承的一个应用
Sep 06 PHP
PHP生成sitemap.xml地图函数
Nov 13 PHP
PHP命名空间(namespace)的使用基础及示例
Aug 18 PHP
比较完整的微信开发php代码
Aug 02 PHP
CI(CodeIgniter)框架实现图片上传的方法
Mar 24 PHP
iis6手工创建网站后无法运行php脚本的解决方法
Jun 08 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
Jun 17 PHP
Laravel中错误与异常处理的用法示例
Sep 16 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 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操作XML、读取数据和写入数据的实现代码
2014/08/15 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
2017/03/19 PHP
一个小型js框架myJSFrame附API使用帮助
2008/06/28 Javascript
jQuery中的bind绑定事件与文本框改变事件的临时解决方法
2010/08/13 Javascript
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
与Math.pow 相反的函数使用介绍
2014/08/04 Javascript
js对象的复制继承实例
2015/01/10 Javascript
EasyUI中实现form表单提交的示例分享
2015/03/01 Javascript
基于HTML模板和JSON数据的JavaScript交互(移动端)
2016/04/06 Javascript
如何在JS中实现相互转换XML和JSON
2016/07/19 Javascript
简单实现js悬浮导航效果
2017/02/05 Javascript
微信小程序实现左滑修改、删除功能
2020/10/19 Javascript
Vue请求JSON Server服务器数据的实现方法
2018/11/02 Javascript
Vue中的methods、watch、computed的区别
2018/11/26 Javascript
详解vue使用插槽分发内容slot的用法
2019/03/28 Javascript
Vue Extends 扩展选项用法完整实例
2019/09/17 Javascript
微信小程序swiper使用网络图片不显示问题解决
2019/12/13 Javascript
[02:38]DOTA2英雄基础教程 噬魂鬼
2014/01/03 DOTA
[01:22:29]真视界:2019年国际邀请赛总决赛
2020/01/29 DOTA
Windows系统下安装Python的SSH模块教程
2015/02/05 Python
浅谈django中的认证与登录
2016/10/31 Python
Python实现的计算马氏距离算法示例
2018/04/03 Python
在python中以相同顺序shuffle两个list的方法
2018/12/13 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
2019/02/16 Python
Python列表操作方法详解
2020/02/09 Python
Python在字符串中处理html和xml的方法
2020/07/31 Python
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
FORZIERI福喜利中国官网:奢侈品购物梦工厂
2019/05/03 全球购物
自荐信范文
2013/12/10 职场文书
单位未婚证明范本
2014/01/18 职场文书
2014政务公开实施方案
2014/02/19 职场文书
宿舍保安职务说明书
2014/02/25 职场文书
入党思想汇报怎么写
2014/04/03 职场文书
班级旅游计划书
2014/05/03 职场文书
Python基础之hashlib模块详解
2021/05/06 Python
利用Python判断你的密码难度等级
2021/06/02 Python