PHP实现的MD5结合RSA签名算法实例


Posted in PHP onOctober 07, 2017

本文实例讲述了PHP实现的MD5结合RSA签名算法。分享给大家供大家参考,具体如下:

<?php
class Md5RSA{
  /**
   * 利用约定数据和私钥生成数字签名
   * @param $data 待签数据
   * @return String 返回签名
   */
  public function sign($data='')
  {
    if (empty($data))
    {
      return False;
    }
    $private_key = file_get_contents(dirname(__FILE__).'/rsa_private_key.pem');
    if (empty($private_key))
    {
      echo "Private Key error!";
      return False;
    }
    $pkeyid = openssl_get_privatekey($private_key);
    if (empty($pkeyid))
    {
      echo "private key resource identifier False!";
      return False;
    }
    $verify = openssl_sign($data, $signature, $pkeyid, OPENSSL_ALGO_MD5);
    openssl_free_key($pkeyid);
    return $signature;
  }
  /**
   * 利用公钥和数字签名以及约定数据验证合法性
   * @param $data 待验证数据
   * @param $signature 数字签名
   * @return -1:error验证错误 1:correct验证成功 0:incorrect验证失败
   */
  public function isValid($data='', $signature='')
  {
    if (empty($data) || empty($signature))
    {
      return False;
    }
    $public_key = file_get_contents(dirname(__FILE__).'/rsa_public_key.pem');
    if (empty($public_key))
    {
      echo "Public Key error!";
      return False;
    }
    $pkeyid = openssl_get_publickey($public_key);
    if (empty($pkeyid))
    {
      echo "public key resource identifier False!";
      return False;
    }
    $ret = openssl_verify($data, $signature, $pkeyid, OPENSSL_ALGO_MD5);
    switch ($ret)
    {
      case -1:
        echo "error";
        break;
      default:
        echo $ret==1 ? "correct" : "incorrect";//0:incorrect
        break;
    }
    return $ret;
  }
}

附:openssl生成证书以及获取公钥和私钥说明

一、RSA方式

1. 建立CA根证书 1) 建立目录RSA 2) 创建以下子目录certs, crl, newcerts 3) 在RSA目录下执行以下操作:

echo 01 > serial
touch index.txt
openssl req -new -x509 -newkey rsa:1024 -keyout CA.key -out CA.pem (生成自签名CA证书)

2. 客户端证书请求

openssl req -new -newkey rsa:1024 -keyout ddmdd_a.key -out ddmdd_a.req (生成ddmdd_a的密钥和证书请求,注意: 此处所填写的用户信息必须与CA证书信息完全一致)
openssl rsa -in ddmdd_a.key -pubout -out ddmdd_a.pub (导出公钥)

3. 为客户签发证书

openssl ca -keyfile CA.key -cert CA.pem -in ddmdd_a.req -out ddmdd_a.pem -notext (使用CA密钥和证书为ddmdd_a签发证书ddmdd_a.pem)
openssl ca -keyfile CA.key -cert CA.pem -in subca_rsareq.pem -out subca.pem -notext (签发二级CA证书)

4. 转换证书格式

openssl x509 -inform pem -outform der -in ddmdd_a.pem -out ddmdd_a.der
openssl pkcs12 -export -in ddmdd_a.pem -inkey ddmdd_a_rsakey.pem -out ddmdd_a.pfx
openssl pkcs12 -in ddmdd_a.pfx -out ddmdd_a.pem
openssl rsa -in ddmdd_a.key -out ddmdd_a_open.key (删除私钥密码)

5. 生成证书撤消列表

echo 01 > crlnumber
openssl ca -keyfile  CA.key -cert CA.pem -revoke ddmdd_a.pem (从CA中撤消证书ddmdd_a.pem)
openssl ca -gencrl -keyfile CA.key -cert CA.pem -out CA.crl (生成或更新证书撤消列表)

6. 查看证书信息

openssl x509 -in CA.pem -noout ?text

二、DSA方式

1. 建立CA根证书 1) 建立目录DSA 2) 创建以下子目录certs, crl, newcerts 3) 在DSA目录下执行以下操作:

echo 01 > serial
touch index.txt
openssl dsaparam -out CA.para 1024 (生成dsa参数文件)
openssl req -new -x509 -newkey dsa:CA.para -keyout CA.key -out CA.pem (使用dsa参数生成自签名CA证书)

2. 客户端证书请求

openssl dsaparam -out ddmdd_b.para 1024 (生成dsa参数文件)
openssl req -new -newkey dsa:ddmdd_b.para -keyout ddmdd_b.key -out ddmdd_b.req (使用dsa参数生成ddmdd_b的密钥和证书请求,注意: 此处所填写的用户信息必须与CA证书信息完全一致)
openssl dsa -in ddmdd_b.key -pubout -out ddmdd_b.pub (导出公钥)

3. 为客户签发证书

openssl ca -keyfile CA.key -cert CA.pem -in ddmdd_b.req -out ddmdd_b.pem -notext (使用CA密钥和证书为ddmdd_b签发证书ddmdd_b.pem)

三、获取公钥和私钥

a) 通过以上方法的生成证书的,可以通过一下命令获得公钥和私钥。

导出公钥:

DSA方式:openssl dsa -in ddmdd_b.key -pubout -out ddmdd_b.pub.pem

RSA方式:openssl rsa -in ddmdd_a.key -pubout -out ddmdd_a.pub.pem

导出私钥:

openssl rsa -in server.key -text > private.pem

b)直接生成公钥和私钥:

openssl genrsa -out private.pem 1024
openssl pkcs8 -nocrypt -topk8 -in private.pem -out pkcs8.pem
openssl rsa -pubout -in private.pem public.pem

另:不清楚RSA算法的推荐看阮老师的http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html

PHP 相关文章推荐
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
Mar 10 PHP
php中函数的形参与实参的问题说明
Sep 01 PHP
php fsockopen伪造post与get方法的详解
Jun 14 PHP
php伪静态之APACHE篇
Jun 02 PHP
基于PHP实现假装商品限时抢购繁忙的效果
Oct 16 PHP
PHP动态生成指定大小随机图片的方法
Mar 25 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
Sep 02 PHP
基于thinkPHP实现的微信自定义分享功能示例
Sep 23 PHP
PHP输出Excel PHPExcel的方法
Jul 26 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
Aug 15 PHP
PHP-FPM 的管理和配置详解
Feb 17 PHP
php字符串过滤strip_tags()函数用法实例分析
Jun 24 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
Oct 07 #PHP
PHP实现打包下载文件的方法示例
Oct 07 #PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
Oct 07 #PHP
PHP使用PDO调用mssql存储过程的方法示例
Oct 07 #PHP
Laravel 5.5官方推荐的Nginx配置学习教程
Oct 06 #PHP
php判断文件上传图片格式的实例详解
Sep 30 #PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
Sep 30 #PHP
You might like
zend framework配置操作数据库实例分析
2012/12/06 PHP
php分页函数完整实例代码
2014/09/22 PHP
微信支付开发告警通知实例
2016/07/12 PHP
设定php简写功能的方法
2019/11/28 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
JavaScript delete操作符应用实例
2009/01/13 Javascript
jQuery编辑器KindEditor4.1.4代码高亮显示设置教程
2013/03/01 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
基于jquery实现ajax无刷新评论
2020/08/19 Javascript
Node.js中使用jQuery的做法
2016/08/17 Javascript
JS获取当前页面名称的简单实例
2016/08/19 Javascript
javascript实现的左右无缝滚动效果
2016/09/19 Javascript
jquery实现弹窗功能(窗口居中显示)
2017/02/27 Javascript
重新理解JavaScript的六种继承方式
2017/03/24 Javascript
AngularJS 表单验证手机号的实例(非必填)
2017/11/12 Javascript
基于vue.js中事件修饰符.self的用法(详解)
2018/02/23 Javascript
vue实现百度下拉列表交互操作示例
2019/03/12 Javascript
nuxt 服务器渲染动态设置 title和seo关键字的操作
2020/11/05 Javascript
python中is与双等于号“==”的区别示例详解
2017/11/21 Python
使用Python实现windows下的抓包与解析
2018/01/15 Python
Python3编码问题 Unicode utf-8 bytes互转方法
2018/10/26 Python
python打开使用的方法
2019/09/30 Python
Pandas之read_csv()读取文件跳过报错行的解决
2020/04/21 Python
Python 将 QQ 好友头像生成祝福语的实现代码
2020/05/03 Python
python实现凯撒密码、凯撒加解密算法
2020/06/11 Python
Keras设置以及获取权重的实现
2020/06/19 Python
利用python批量爬取百度任意类别的图片的实现方法
2020/10/07 Python
乌克兰鞋类购物网站:Eobuv.com.ua
2020/11/28 全球购物
PHP中如何使用Cookie
2015/10/28 面试题
一份全面的PHP面试问题考卷
2012/07/15 面试题
英语商务邀请函范文
2014/01/16 职场文书
大四自我鉴定
2014/02/08 职场文书
公司中秋节活动方案
2014/02/12 职场文书
工作会议主持词
2014/03/17 职场文书
老人祝寿主持词
2014/03/28 职场文书