php 生成签名及验证签名详解

5年以前  |  阅读数:659 次  |  编程语言:PHP 

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分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
文件下载
贪吃蛇
获取IMEI
双位运算符
发送邮件
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
提取后缀名
年的日历图
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例