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
将OICQ数据转成MYSQL数据
Oct 09 PHP
Blitz templates 最快的PHP模板引擎
Apr 06 PHP
php将fileterms函数返回的结果变成可读的形式
Apr 21 PHP
解析csv数据导入mysql的方法
Jul 01 PHP
浅析PHP的ASCII码转换类
Jul 05 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
Feb 13 PHP
php实现MySQL数据库备份与还原类实例
Dec 09 PHP
使用PHP进行微信公众平台开发的示例
Aug 21 PHP
PHP实现浏览器中直接输出图片的方法示例
Mar 14 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
Sep 04 PHP
PHP PDOStatement::execute讲解
Jan 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
DIY一个适配电脑声卡的动圈话筒放大器
2021/03/02 无线电
php split汉字
2009/06/05 PHP
Laravel 5框架学习之模型、控制器、视图基础流程
2015/04/08 PHP
php注册登录系统简化版
2020/12/28 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
2019/11/09 PHP
javascript编程起步(第六课)
2007/02/27 Javascript
javascript parseInt 函数分析(转)
2009/03/21 Javascript
javascript下高性能字符串连接StringBuffer类
2010/08/16 Javascript
JS数学函数Exp使用说明
2012/08/09 Javascript
js预加载图片方法汇总
2015/06/15 Javascript
JS实现三个层重叠点击互相切换的方法
2015/10/06 Javascript
JavaScript中对DOM节点的访问、创建、修改、删除
2015/11/16 Javascript
js实现密码强度检测【附示例】
2016/03/30 Javascript
vue cli 全面解析
2018/02/28 Javascript
简单通过settimeout看javascript的运行机制
2019/05/10 Javascript
微信小程序登陆注册功能的实现代码
2019/12/10 Javascript
vue中移动端调取本地的复制的文本方式
2020/07/18 Javascript
浅谈Vue使用Elementui修改默认的最快方法
2020/12/05 Vue.js
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
解析Python中的异常处理
2015/04/28 Python
解决python3捕获cx_oracle抛出的异常错误问题
2018/10/18 Python
对Python w和w+权限的区别详解
2019/01/23 Python
Python3.5面向对象与继承图文实例详解
2019/04/24 Python
Django框架首页和登录页分离操作示例
2019/05/28 Python
Python使用lambda表达式对字典排序操作示例
2019/07/25 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
基于pandas中expand的作用详解
2019/12/17 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
2020/01/04 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
Django模型验证器介绍与源码分析
2020/09/08 Python
Python基于Serializer实现字段验证及序列化
2020/11/04 Python
在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排
2014/01/13 面试题
大学生自荐书范文
2013/12/10 职场文书
机电一体化专业求职信
2014/07/22 职场文书
2015年初中元旦晚会活动总结
2014/11/28 职场文书
公司财务管理制度
2015/08/04 职场文书