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 相关文章推荐
WML,Apache,和 PHP 的介绍
Oct 09 PHP
网页游戏开发入门教程二(游戏模式+系统)
Nov 02 PHP
Linux下手动编译安装PHP扩展的例子分享
Jul 15 PHP
php实现过滤表单提交中html标签的方法
Oct 17 PHP
thinkphp在低版本Nginx 下支持PATHINFO的方法分享
May 27 PHP
PHP实现表单提交时去除斜杠的方法
Dec 26 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
Apr 26 PHP
PHP使用SMTP邮件服务器发送邮件示例
Aug 28 PHP
php微信扫码支付 php公众号支付
Mar 24 PHP
PHP反射原理与用法深入分析
Sep 28 PHP
Yii框架Session与Cookie使用方法示例
Oct 14 PHP
YII2 全局异常处理深入讲解
Mar 24 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
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
laravel 5.4中实现无限级分类的方法示例
2017/07/27 PHP
PHP实现微信商户支付企业付款到零钱功能
2018/09/30 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
2018/10/14 PHP
自动检查并替换文本框内的字符
2006/06/30 Javascript
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
javascript (用setTimeout而非setInterval)
2011/12/28 Javascript
javascript中关于&amp;&amp; 和 || 表达式的小技巧分享
2015/04/10 Javascript
JavaScript中的Repaint和Reflow用法详解
2015/07/27 Javascript
jquery判断复选框是否被选中的方法
2015/10/16 Javascript
跟我学习javascript的异步脚本加载
2015/11/20 Javascript
jquery日历插件datepicker用法分析
2016/01/22 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
2016/08/23 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
2016/09/28 Javascript
AngularJS解决ng界面长表达式(ui-set)的方法分析
2016/11/07 Javascript
用v-html解决Vue.js渲染中html标签不被解析的问题
2016/12/14 Javascript
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
SVG实现时钟效果
2018/07/17 Javascript
webpack4 处理SCSS的方法示例
2018/09/03 Javascript
vue3使用vue-count-to组件的实现
2020/12/25 Vue.js
[44:47]Ti4 循环赛第三日 iG vs NaVi
2014/07/12 DOTA
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
python实现外卖信息管理系统
2018/01/11 Python
使用pandas实现csv/excel sheet互相转换的方法
2018/12/10 Python
Python3实现的回文数判断及罗马数字转整数算法示例
2019/03/27 Python
Python错误的处理方法
2020/06/23 Python
学python最电脑配置有要求么
2020/07/05 Python
房地产开发计划书
2014/01/10 职场文书
商场活动策划方案
2014/01/24 职场文书
小学生评语集锦
2014/04/18 职场文书
领导班子专题民主生活会情况想汇报
2014/09/30 职场文书
领导欢迎词范文
2015/01/26 职场文书
调解书格式范本
2015/05/20 职场文书
在职证明范本
2015/06/15 职场文书
Canvas三种动态画圆实现方法说明(小结)
2021/04/16 Javascript
Win11右下角图标点了没反应怎么办?Win11点击右下角图标无反应解决方法汇总
2022/07/07 数码科技