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出错界面
Oct 09 PHP
用PHP创建PDF中文文档
Oct 09 PHP
如何在PHP中使用Oracle数据库(4)
Oct 09 PHP
php中echo()和print()、require()和include()等易混淆函数的区别
Feb 22 PHP
探讨:如何使用PHP实现计算两个日期间隔的年、月、周、日数
Jun 13 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
Jun 10 PHP
双冒号 ::在PHP中的使用情况
Nov 05 PHP
PHP抓取淘宝商品的用户晒单评论+图片+搜索商品列表实例
Apr 14 PHP
在Laravel5.6中使用Swoole的协程数据库查询
Jun 15 PHP
php PDO属性设置与操作方法分析
Dec 27 PHP
Thinkphp5框架ajax接口实现方法分析
Aug 28 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
Feb 15 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生成带有雪花背景的验证码
2006/10/09 PHP
session在PHP大型web应用中的使用
2011/06/25 PHP
使用纯php代码实现页面伪静态的方法
2015/07/25 PHP
laravel框架 laravel-admin上传图片到oss的方法
2019/10/13 PHP
Jquery 插件学习实例1 插件制作说明与tableUI优化
2010/04/02 Javascript
关于js new Date() 出现NaN 的分析
2012/10/23 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
本人自用的global.js库源码分享
2015/02/28 Javascript
JS使用oumousemove和oumouseout动态改变图片显示的方法
2015/03/31 Javascript
测试IE浏览器对JavaScript的AngularJS的兼容性
2015/06/19 Javascript
详解JavaScript中|单竖杠运算符的使用方法
2016/05/23 Javascript
jquery操作select常见方法大全【7种情况】
2019/05/28 jQuery
浅谈Vue.js之初始化el以及数据的绑定说明
2019/11/14 Javascript
2020京东618叠蛋糕js脚本(亲测好用)
2020/06/02 Javascript
[00:17]游戏风云独家报道:DD赛后说出数字秘密 吓死你们啊!
2014/07/13 DOTA
Python 统计字数的思路详解
2018/05/08 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
Python爬取数据并写入MySQL数据库的实例
2018/06/21 Python
Python GUI编程 文本弹窗的实例
2019/06/11 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
用python爬取历史天气数据的方法示例
2019/12/30 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
2020/03/23 Python
python爬虫构建代理ip池抓取数据库的示例代码
2020/09/22 Python
python 实现图片修复(可用于去水印)
2020/11/19 Python
HTML5实现QQ聊天气泡效果
2017/06/26 HTML / CSS
Reebonz中国官网:新加坡奢侈品购物网站
2017/03/17 全球购物
波兰灯具、照明和LED购物网站:Lampy.pl
2019/03/11 全球购物
如何用Java判断一个文件或目录是否存在
2012/11/19 面试题
综合实践活动方案
2014/02/14 职场文书
《草原的早晨》教学反思
2014/04/08 职场文书
事业单位鉴定材料
2014/05/25 职场文书
政府采购方案
2014/06/12 职场文书
工商局副局长个人对照检查材料
2014/09/25 职场文书
导游词之无锡梅园
2019/11/28 职场文书
HTML基本元素标签介绍
2022/02/28 HTML / CSS
《最终幻想14》6.01版本4月5日推出 追加新任务新道具
2022/04/03 其他游戏