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自定义函数返回多个值
Nov 26 PHP
PHP5中的时间相差8小时的解决办法
Mar 28 PHP
PHP 自定义错误处理函数trigger_error()
Mar 26 PHP
ThinkPHP3.1新特性之查询条件预处理简介
Jun 19 PHP
VB中的RasEnumConnections函数返回632错误解决方法
Jul 29 PHP
详谈PHP文件目录基础操作
Nov 11 PHP
PHP安全上传图片的方法
Mar 21 PHP
PHP变量赋值、代入给JavaScript中的变量
Jun 29 PHP
简介PHP的Yii框架中缓存的一些高级用法
Mar 29 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
Nov 04 PHP
thinkPHP js文件中U方法不被解析问题的解决方法
Dec 05 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
Oct 10 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 加密与解密的斗争
2009/04/17 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
8个PHP程序员常用的功能汇总
2014/12/18 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
thinkPHP框架中执行事务的方法示例
2018/05/31 PHP
php闭包中使用use声明变量的作用域实例分析
2018/08/09 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
2018/12/25 PHP
php将字符串转换为数组实例讲解
2020/05/05 PHP
利用js获取服务器时间的两个简单方法
2010/01/08 Javascript
Javascript 实用小技巧
2010/04/07 Javascript
JavaScript.The.Good.Parts阅读笔记(二)作用域&amp;闭包&amp;减缓全局空间污染
2010/11/16 Javascript
jquerymobile checkbox及时刷新才能获取其准确值
2012/04/14 Javascript
浅析JavaScript中的CSS属性及命名规范
2013/11/28 Javascript
js同源策略详解
2015/05/21 Javascript
JavaScript中的Math.sin()方法使用详解
2015/06/15 Javascript
jQuery简单实现验证邮箱格式
2015/07/15 Javascript
jquery+json实现数据二级联动的方法
2015/11/28 Javascript
最全的Javascript编码规范(推荐)
2016/06/22 Javascript
JS实现显示带倒影的图片横排居中放大展示特效实例【测试可用】
2016/08/23 Javascript
详解vue-cli3使用
2018/08/14 Javascript
在微信小程序中渲染HTML内容的方法示例
2018/09/28 Javascript
利用jquery和BootStrap实现动态滚动条效果
2018/12/03 jQuery
[54:10]完美世界DOTA2联赛PWL S2 Magma vs FTD 第二场 11.29
2020/12/03 DOTA
python 浅谈serial与stm32通信的编码问题
2019/12/18 Python
HTML5 input新增type属性color颜色拾取器的实例代码
2018/08/27 HTML / CSS
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
英国时尚女装购物网站:Missguided
2018/08/23 全球购物
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
2014/10/31 面试题
网上书店创业计划书
2014/01/12 职场文书
优秀导游先进事迹材料
2014/01/25 职场文书
大学生求职计划书
2014/04/30 职场文书
2015年“七七卢沟桥事变”纪念活动总结
2015/03/24 职场文书
2015年店长工作总结范文
2015/04/08 职场文书
2015年绩效考核工作总结
2015/05/23 职场文书
聘任通知书
2015/09/21 职场文书
工作总结之小学教师体育工作范文(3篇)
2019/10/07 职场文书