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 相关文章推荐
通过JavaScript或PHP检测Android设备的代码
Mar 09 PHP
PHP读取ACCESS数据到MYSQL的代码
May 11 PHP
PHP5中新增stdClass 内部保留类
Jun 13 PHP
支持中文字母数字、自定义字体php验证码代码
Feb 27 PHP
php 修改、增加xml结点属性的实现代码
Oct 22 PHP
php构造方法中析构方法在继承中的表现
Apr 12 PHP
常用PHP封装分页工具类
Jan 14 PHP
phpstudy默认不支持64位php的解决方法
Feb 20 PHP
php 一维数组的循环遍历实现代码
Apr 10 PHP
php实现批量上传数据到数据库(.csv格式)的案例
Jun 18 PHP
CodeIgniter框架数据库基本操作示例
May 24 PHP
php curl优化下载微信头像的方法总结
Sep 07 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
ThinkPHP学习笔记(一)ThinkPHP部署
2014/06/22 PHP
javascript 放大镜 v1.0 基于Yui2 实现的放大镜效果
2010/03/08 Javascript
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
2011/08/23 Javascript
js实现快速分享功能(你的文章分享工具)
2013/06/25 Javascript
jquery判断小数点两位和自动删除小数两位后的数字
2014/03/19 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
2015/03/02 Javascript
jQuery插件Elastislide实现响应式的焦点图无缝滚动切换特效
2015/04/12 Javascript
js中的内部属性与delete操作符介绍
2015/08/10 Javascript
详解AngularJS Filter(过滤器)用法
2015/12/28 Javascript
AngularJS 与Bootstrap实现表格分页实例代码
2016/10/14 Javascript
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
2017/06/04 Javascript
Vue项目中使用Vux的安装过程
2018/05/01 Javascript
Vue函数式组件的应用实例详解
2019/08/30 Javascript
过滤器vue.filters的使用方法实现
2019/09/18 Javascript
微信小程序实现注册登录功能(表单校验、错误提示)
2019/12/10 Javascript
小程序外卖订单界面的示例代码
2019/12/30 Javascript
[40:05]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[04:16]完美世界DOTA2联赛PWL S2 集锦第一期
2020/11/23 DOTA
python基于multiprocessing的多进程创建方法
2015/06/04 Python
在Python中使用正则表达式的方法
2015/08/13 Python
学习Python selenium自动化网页抓取器
2018/01/20 Python
怎么使用pipenv管理你的python项目
2018/03/12 Python
python3+PyQt5自定义视图详解
2018/04/24 Python
详解Python 定时框架 Apscheduler原理及安装过程
2019/06/14 Python
python飞机大战 pygame游戏创建快速入门详解
2019/12/17 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
使用keras实现densenet和Xception的模型融合
2020/05/23 Python
PyTorch预训练Bert模型的示例
2020/11/17 Python
Python修改DBF文件指定列
2020/12/19 Python
技术总监岗位职责
2013/12/05 职场文书
大学生个人自荐信样本
2014/03/02 职场文书
本科毕业自我鉴定
2014/03/20 职场文书
学校节能减排方案
2014/06/13 职场文书
公司周年庆活动方案
2014/08/25 职场文书
开幕式邀请函
2015/01/31 职场文书
远程教育集中轮训基层干部培训班学习心得体会
2016/01/09 职场文书