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 相关文章推荐
NT IIS下用ODBC连接数据库
Oct 09 PHP
php 什么是PEAR?(第二篇)
Mar 19 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
Jun 23 PHP
详解PHP中strlen和mb_strlen函数的区别
Mar 07 PHP
php遍历文件夹下的所有文件和子文件夹示例
Mar 20 PHP
50个PHP程序性能优化的方法
Jun 02 PHP
PHP中使用hidef扩展代替define提高性能
Apr 09 PHP
Thinkphp自定义代码生成工具及用法说明(附下载地址)
May 27 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 PHP
php文件操作之文件写入字符串、数组的方法分析
Apr 15 PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
Oct 17 PHP
PHP底层运行机制与工作原理详解
Jul 31 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下的权限算法的实现
2007/04/28 PHP
在同一窗体中使用PHP来处理多个提交任务
2008/05/08 PHP
PHP 年龄计算函数(精确到天)
2012/06/07 PHP
一些主流JS框架中DOMReady事件的实现小结
2011/02/12 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
2014/01/13 Javascript
jQuery EasyUI datagrid实现本地分页的方法
2015/02/13 Javascript
jQuery判断数组是否包含了指定的元素
2015/03/10 Javascript
Javascript 动态改变imput type属性
2016/11/01 Javascript
Bootstrap导航条鼠标悬停下拉菜单
2017/01/04 Javascript
js实现模糊匹配功能
2017/02/15 Javascript
js canvas实现擦除效果示例代码
2017/04/26 Javascript
基于JavaScript实现百度搜索框效果
2020/06/28 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
2018/11/21 Javascript
Vue中错误图片的处理的实现代码
2019/11/07 Javascript
微信小程序纯文本实现@功能
2020/04/08 Javascript
vue实现div单选多选功能
2020/07/16 Javascript
Openlayers实现地图全屏显示
2020/09/28 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
python中二维阵列的变换实例
2014/10/09 Python
Python生成8位随机字符串的方法分析
2017/12/05 Python
Python lambda函数基本用法实例分析
2018/03/16 Python
Python编程在flask中模拟进行Restful的CRUD操作
2018/12/28 Python
python 绘制拟合曲线并加指定点标识的实现
2019/07/10 Python
Python3.x+迅雷x 自动下载高分电影的实现方法
2020/01/12 Python
Python 处理日期时间的Arrow库使用
2020/08/18 Python
python创建文本文件的简单方法
2020/08/30 Python
python使用numpy中的size()函数实例用法详解
2021/01/29 Python
阿迪达斯芬兰官方网站:adidas芬兰
2017/01/30 全球购物
英国森林假期:Forest Holidays
2021/01/01 全球购物
2014年五一活动策划方案
2014/03/15 职场文书
社区党建工作汇报材料
2014/10/27 职场文书
展览会邀请函
2015/02/02 职场文书
财务稽核岗位职责
2015/04/13 职场文书
2015财务年度工作总结范文
2015/05/04 职场文书
教师纪律作风整顿心得体会
2016/01/23 职场文书
Python还能这么玩之只用30行代码从excel提取个人值班表
2021/06/05 Python