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性能的21种方法介绍
Jun 25 PHP
解析php 版获取重定向后的地址(代码)
Jun 26 PHP
php中call_user_func函数使用注意事项
Nov 21 PHP
thinkphp的URL路由规则与配置实例
Nov 26 PHP
php实现以只读方式打开文件的方法
Mar 16 PHP
php文件下载处理方法分析
Apr 22 PHP
php 类自动载入的方法
Jun 03 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
Oct 14 PHP
解决微信授权回调页面域名只能设置一个的问题
Dec 11 PHP
详解php中生成标准uuid(guid)的方法
Apr 28 PHP
php连接sftp的作用以及实例代码
Sep 23 PHP
PHP mkdir创建文件夹实现方法解析
Nov 13 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
php判断终端是手机还是电脑访问网站的思路及代码
2013/04/24 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
2013/06/28 PHP
php记录代码执行时间(实现代码)
2013/07/05 PHP
PHP文件缓存内容保存格式实例分析
2014/08/20 PHP
PHP中怎样防止SQL注入分析
2014/10/23 PHP
php验证手机号码
2015/11/11 PHP
javascript与有限状态机详解
2014/05/08 Javascript
纯CSS3代码实现滑动开关效果
2015/08/19 Javascript
jQuery实现连续动画效果实例分析
2015/10/09 Javascript
JS组件Bootstrap Select2使用方法详解
2020/04/17 Javascript
详解JavaScript中的事件流和事件处理程序
2016/05/20 Javascript
jQuery向父辈遍历的简单方法
2016/09/18 Javascript
Node.js中常规的文件操作总结
2016/10/13 Javascript
利用Bootstrap实现表格复选框checkbox全选
2016/12/21 Javascript
Jquery鼠标放上去显示全名的实现方法
2017/02/06 Javascript
详解vue-cli构建项目反向代理配置
2017/09/07 Javascript
jQuery实现判断上传图片类型和大小的方法示例
2018/04/11 jQuery
Vue computed 计算属性代码实例
2020/04/22 Javascript
python pdb调试方法分享
2014/01/21 Python
Python下线程之间的共享和释放示例
2015/05/04 Python
python列表的常用操作方法小结
2016/05/21 Python
python3.5仿微软计算器程序
2020/03/30 Python
推荐10款最受Python开发者欢迎的Python IDE
2018/09/16 Python
Window环境下Scrapy开发环境搭建
2018/11/18 Python
Python发展史及网络爬虫
2019/06/19 Python
Django框架基础模板标签与filter使用方法详解
2019/07/23 Python
matplotlib阶梯图的实现(step())
2021/03/02 Python
HTML5自定义mp3播放器源码
2020/01/06 HTML / CSS
临时用工协议书范本
2014/10/29 职场文书
2015年教务主任工作总结
2015/07/22 职场文书
护士岗前培训心得体会
2016/01/08 职场文书
《小摄影师》教学反思
2016/02/18 职场文书
2019关于实习生工作安排及待遇的管理方案!
2019/07/16 职场文书
2019年恭贺升学祝福语集锦
2019/08/15 职场文书
教你使用pyinstaller打包Python教程
2021/05/27 Python
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python