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用数组返回无限分类的列表数据的代码
Aug 08 PHP
php多文件上传功能实现原理及代码
Apr 18 PHP
基于php权限分配的实现代码
Apr 28 PHP
Drupal读取Excel并导入数据库实例
Mar 02 PHP
laravel 4安装及入门图文教程
Oct 29 PHP
php使用类继承解决代码重复的问题
Feb 11 PHP
PHP生成条形码大揭秘
Sep 24 PHP
Yii框架上传图片用法总结
Mar 28 PHP
php is_executable判断给定文件名是否可执行实例
Sep 26 PHP
php数据结构之顺序链表与链式线性表示例
Jan 22 PHP
PHP设计模式之适配器模式定义与用法详解
Apr 03 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
解决phpmyadmin中缺少mysqli扩展问题的方法
2013/05/06 PHP
php实现数组筛选奇数和偶数示例
2014/04/11 PHP
php获取'/'传参的值简单方法
2017/07/13 PHP
PHP基于IMAP收取邮件的方法示例
2017/08/07 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
用 Javascript 验证表单(form)中的单选(radio)值
2009/09/08 Javascript
利用JQuery制作符合Web标准的QQ弹出消息
2014/01/14 Javascript
JS实现点击按钮自动增加一个单元格的方法
2015/03/09 Javascript
教你使用javascript简单写一个页面模板引擎
2015/05/05 Javascript
JS模拟Dialog弹出浮动框效果代码
2015/10/16 Javascript
js实现五星评价功能
2017/03/08 Javascript
js canvas实现擦除效果示例代码
2017/04/26 Javascript
ubuntu编译nodejs所需的软件并安装
2017/09/12 NodeJs
es6系列教程_ Map详解以及常用api介绍
2017/09/25 Javascript
一篇文章介绍redux、react-redux、redux-saga总结
2019/05/23 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
2019/10/16 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
2019/10/26 Javascript
[02:32]DOTA2英雄基础教程 美杜莎
2014/01/07 DOTA
[03:07]【DOTA2亚洲邀请赛】我们,梦开始的地方
2017/03/07 DOTA
[56:29]Secret vs Optic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
深入分析在Python模块顶层运行的代码引起的一个Bug
2014/07/04 Python
在Python的Flask框架中使用日期和时间的教程
2015/04/21 Python
Python抽象类的新写法
2015/06/18 Python
python操作 hbase 数据的方法
2016/12/18 Python
Python使用filetype精确判断文件类型
2017/07/02 Python
python 创建弹出式菜单的实现代码
2017/07/11 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
荷兰网上药店:Drogisterij.net
2019/09/03 全球购物
经营理念口号
2014/06/21 职场文书
大学生工作求职信
2014/06/23 职场文书
党组织领导班子整改方案
2014/10/25 职场文书
董事长助理工作总结2015
2015/07/23 职场文书
2016春季幼儿园大班开学寄语
2015/12/03 职场文书
2019新学期家长会工作计划
2019/08/21 职场文书
读《皮囊》有感:理解是对他人的最大的善举
2019/11/14 职场文书
MYSQL 无法识别中文的永久解决方法
2021/06/03 MySQL