源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

PHP实现的MD5结合RSA签名算法实例

  • 时间:2021-01-15 17:51 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:PHP实现的MD5结合RSA签名算法实例
本文实例讲述了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;
  }
}

[b]附:openssl生成证书以及获取公钥和私钥说明[/b] [b]一、RSA方式[/b] 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 [b]二、DSA方式[/b] 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) [b]三、获取公钥和私钥[/b] 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算法的推荐看阮老师的[url=http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html]http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html[/url] [b]PS:关于加密解密感兴趣的朋友还可以参考本站在线工具:[/b] [b]文字在线加密解密工具(包含AES、DES、RC4等): [/b][url=http://tools.jb51.net/password/txt_encode]http://tools.jb51.net/password/txt_encode[/url] [b]MD5在线加密工具: [/b][url=http://tools.jb51.net/password/CreateMD5Password]http://tools.jb51.net/password/CreateMD5Password[/url] [b]在线散列/哈希算法加密工具: [/b][url=http://tools.jb51.net/password/hash_encrypt]http://tools.jb51.net/password/hash_encrypt[/url] [b]在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具: [/b][url=http://tools.jb51.net/password/hash_md5_sha]http://tools.jb51.net/password/hash_md5_sha[/url] [b]在线sha1/sha224/sha256/sha384/sha512加密工具: [/b][url=http://tools.jb51.net/password/sha_encode]http://tools.jb51.net/password/sha_encode[/url] 更多关于PHP相关内容感兴趣的读者可查看本站专题:《[url=http://www.1sucai.cn/Special/144.htm]php加密方法总结[/url]》、《[url=http://www.1sucai.cn/Special/459.htm]PHP编码与转码操作技巧汇总[/url]》、《[url=http://www.1sucai.cn/Special/630.htm]PHP数学运算技巧总结[/url]》、《[url=http://www.1sucai.cn/Special/623.htm]PHP数组(Array)操作技巧大全[/url]》、《[url=http://www.1sucai.cn/Special/47.htm]php字符串(string)用法总结[/url]》、《[url=http://www.1sucai.cn/Special/614.htm]PHP数据结构与算法教程[/url]》、《[url=http://www.1sucai.cn/Special/111.htm]php程序设计算法总结[/url]》及《[url=http://www.1sucai.cn/Special/180.htm]php正则表达式用法总结[/url]》 希望本文所述对大家PHP程序设计有所帮助。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部