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注入实例
Oct 09 PHP
PHP 采集程序 常用函数
Dec 18 PHP
php文件上传表单摘自drupal的代码
Feb 15 PHP
phpmailer发送gmail邮件实例详解
Jun 24 PHP
CI框架在CLI下执行占用内存过大问题的解决方法
Jun 17 PHP
PHP正则获取页面所有图片地址
Mar 23 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
Apr 04 PHP
php抛出异常与捕捉特定类型的异常详解
Oct 26 PHP
ThinkPHP简单使用memcache缓存的方法
Nov 15 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
Nov 16 PHP
PHP自动生成缩略图函数的源码示例
Mar 18 PHP
PHP实现chrome表单请求数据转换为接口使用的json数据
Mar 04 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与ASP
2006/10/09 PHP
PHP学习笔记 IIS7下安装配置php环境
2012/10/29 PHP
php+mysql实现简单的增删改查功能
2015/07/13 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
2016/07/13 PHP
PHP实现正则表达式分组捕获操作示例
2018/02/03 PHP
Laravel框架源码解析之入口文件原理分析
2020/05/14 PHP
重定向实现代码
2006/11/20 Javascript
javascript radio 联动效果
2009/03/04 Javascript
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
jQuery 中使用JSON的实现代码
2011/12/01 Javascript
javascript实现仿腾讯游戏选择
2015/05/14 Javascript
window.onload使用指南
2015/09/13 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
2015/10/26 Javascript
jquery悬浮提示框完整实例
2016/01/13 Javascript
基于JavaScript代码实现自动生成表格
2016/06/15 Javascript
Angular Module声明和获取重载实例代码
2016/09/14 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
2016/12/23 Javascript
老生常谈js数据类型
2017/08/03 Javascript
vue 计时器组件的实现代码
2017/09/14 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
2018/02/21 Javascript
JavaScript图片处理与合成总结
2018/03/04 Javascript
使用vuex缓存数据并优化自己的vuex-cache
2018/05/30 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
python基础教程之元组操作使用详解
2014/03/25 Python
Python3基础之输入和输出实例分析
2014/08/18 Python
Python实现基本数据结构中栈的操作示例
2017/12/04 Python
Python使用matplotlib绘制余弦的散点图示例
2018/03/14 Python
对python 通过ssh访问数据库的实例详解
2019/02/19 Python
最小二乘法及其python实现详解
2020/02/24 Python
HTML5 video进入全屏和退出全屏的实现方法
2020/07/28 HTML / CSS
澳大利亚100%丝绸多彩度假装商店:TheSwankStore
2019/09/04 全球购物
大学生入党自我鉴定
2013/10/31 职场文书
老师给学生的表扬信
2014/01/17 职场文书
佛光寺导游词
2015/02/10 职场文书
《中国古代诗歌散文欣赏》高中语文教材
2019/08/20 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang