侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

ThinkPHP实现的rsa非对称加密类示例

ThinkPHP  /  管理员 发布于 7年前   397

本文实例讲述了ThinkPHP实现的rsa非对称加密类。分享给大家供大家参考,具体如下:

公钥加密后的字符串是一直变化的,但是用私钥解密后的内容仍然是相同的,这是为了加密数据使用的。

私钥加密的字符串是不会变化的,即使暴露在外网上别人截取时如果没有公钥也是看不出来内容的,仅允许给予公钥的第三方来解密并看到内容,实际作用相当于签名功能,如果能拿到未加密的内容,说明一定是信任方的数据,因为有他的签名啊。

其实这种非对称加密技术可以用于单点登录中去,安全级别高,能解密获取到内容应该就是信任方的数据。

'CN', 'stateOrProvinceName'=>'beijing', 'localityName'=>'beijing','organizationName'=>'clcw',    'organizationalUnitName'=>'clcw', 'commonName'=>'clcw', 'emailAddress'=>'[email protected]');  $privkeypass = 'secret';  //私钥密码  $numberOfDays = 365;   //有效时长,单位为天  //生成证书  $privkey = openssl_pkey_new();  $csr = openssl_csr_new($dn, $privkey);  $sscert = openssl_csr_sign($csr, null, $privkey, $numberOfDays);  openssl_x509_export_to_file($sscert, self::CERPATH);  openssl_pkcs12_export_to_file($sscert, self::PFXPATH, $privkey, $privkeypass);  (file_exists(self::CERPATH)) or die('公钥的文件路径错误');  (file_exists(self::PFXPATH)) or die('密钥的文件路径错误');  }  public static function verifyData($originData, $decryptData)  {  $cer_key = file_get_contents(self::$cerpath);  $cer = openssl_x509_read($cer_key);  $res = openssl_verify($originData, $decryptData, $cer);  var_dump($res);  }  /**  * 生成公钥私钥文件  * @param $appName string 应用名称  */  public static function generateKey($appName='')  {  $result = ['status'=>0, 'msg'=>''];  if (!extension_loaded('openssl') ) {   $result['msg'] = 'php需要openssl支持';  }  //创建公钥  $res = openssl_pkey_new();//array('private_key_bits'=>512) 这一串参数不加,否则只能加密54个长度的字符串  //提取私钥  openssl_pkey_export($res, $privatekey);  //生成公钥  $public_key = openssl_pkey_get_details($res);  $publickey = $public_key['key'];  // $path = self::FILEDIR.$appName;  try{   // file_put_contents($path.'_public.pem', $publickey);   // file_put_contents($path.'_private.pem', $privatekey);   $result['status'] = 1;   $result['publickey'] = $publickey;   $result['privatekey'] = $privatekey;  }catch(\Exception $e) {   // throw new \Exception($e->getMessage());   $result['msg'] = $e->getMessage();  }  return $result;  }  /**  * 用私钥加密数据  * @param $data string 需要加密的字符串(最好不要超过200个字符)  * @param $appName string 应用名称  */  public static function privateEncrypt($data, $appName)  {  $result = ['status'=>0, 'msg'=>''];  $privatekey = C($appName.'.PRIVATE_KEY');  $myinfo = 'In '.__METHOD__.',privatekey:'.$privatekey."\n";  file_put_contents('/tmp/shiyf.log', $myinfo, FILE_APPEND);  //生成resource类型的密钥,如果密钥文件内容被破坏,openssl_pkey_get_private函数返回false  $privatekey = openssl_pkey_get_private($privatekey);  if (empty($privatekey)) {   $result['msg'] = '密钥不可用';  }  $encryptData = '';  //用私钥加密  if (openssl_private_encrypt($data, $encryptData, $privatekey)) {   $result['msg'] = base64_encode($encryptData);   $result['status'] = 1;  } else {   $result['msg'] = '加密失败!';  }  return $result;  }  /**  * 用公钥解密数据  * @param $data string 需要解密的字符串(最好不要超过200个字符)  * @param $appName string 应用名称  */  public static function publicDecrypt($data, $appName)  {  $result = ['status'=>0, 'msg'=>''];  $data = base64_decode($data);  $publickey = C($appName.'.PUBLIC_KEY');  //生成resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_public函数返回false  $publickey = openssl_pkey_get_public($publickey);  if (empty($publickey)) {   $result['msg'] = '公钥不可用';  }  //解密数据  $decryptData = '';  if (openssl_public_decrypt($data, $decryptData, $publickey)) {   $result['msg'] = $decryptData;   $result['status'] = 1;  } else {   $result['msg'] = '解密失败';  }  return $result;  }  /**  * 用公钥加密数据  * @param $data string 需要加密的字符串(最好不要超过200个字符)  * @param $appName string 应用名称  */  public static function publicEncrypt($data, $publickey)  {  $result = ['status'=>0, 'msg'=>''];  //生成resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_private函数返回false  $publickey = openssl_pkey_get_public($publickey);  if (empty($publickey)) {   $result['msg'] = '公钥不可用';  }  $encryptData = '';  //用私钥加密  if (openssl_public_encrypt($data, $encryptData, $publickey)) {   $result['msg'] = base64_encode($encryptData);   $result['status'] = 1;  } else {   $result['msg'] = '加密失败!';  }  return $result;  }  /**  * 用私钥加密数据  * @param $data string 需要解密的字符串(最好不要超过200个字符)  * @param $appName string 应用名称  */  public static function privateDecrypt($data, $appName)  {  $result = ['status'=>0, 'msg'=>''];  $data = base64_decode($data);  $privatekey = C($appName.'.PRIVATE_KEY');  //生成resource类型的私钥,如果私钥文件内容被破坏,openssl_pkey_get_public函数返回false  $privatekey = openssl_pkey_get_private($privatekey);  if (empty($privatekey)) {   $result['msg'] = '私钥不可用';  }  //解密数据  $decryptData = '';  if (openssl_private_decrypt($data, $decryptData, $privatekey)) {   $result['msg'] = $decryptData;   $result['status'] = 1;  } else {   $result['msg'] = '解密失败';  }  return $result;  }}

PS:关于加密解密感兴趣的朋友还可以参考本站在线工具:

在线RSA加密/解密工具:
http://tools..net.cn/password/rsa_encode

文字在线加密解密工具(包含AES、DES、RC4等):
http://tools..net.cn/password/txt_encode

在线散列/哈希算法加密工具:
http://tools..net.cn/password/hash_encrypt

在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools..net.cn/password/hash_md5_sha

在线sha1/sha224/sha256/sha384/sha512加密工具:
http://tools..net.cn/password/sha_encode

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

您可能感兴趣的文章:

  • thinkphp3.x中cookie方法的用法分析
  • thinkphp中session和cookie无效的解决方法
  • ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
  • thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
  • thinkPHP5项目中实现QQ第三方登录功能
  • thinkPHP中U方法加密传递参数功能示例
  • thinkphp微信开发(消息加密解密)
  • thinkphp微信开之安全模式消息加密解密不成功的解决办法
  • PHP隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
  • tp5框架使用cookie加密算法实现登录功能示例


  • 上一条:
    thinkPHP中U方法加密传递参数功能示例
    下一条:
    thinkPHP3.2.3结合Laypage实现的分页功能示例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • thinkphp + mongodb项目中数据加载慢问题分析及解决(0个评论)
    • thinkphp6框架中封装redis操作类(0个评论)
    • thinkphp6框架中实现定时任务功能流程步骤(0个评论)
    • Thinkphp5.1框架中实现Session+Redis会话共享流程步骤(0个评论)
    • TP5框架版本5.0.10安全漏洞根据官方补丁修复,也是本站安全漏洞修复(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-12
    • 2018-01
    • 2018-02
    • 2020-03
    • 2021-07
    • 2021-12
    • 2022-05
    • 2022-06
    • 2022-09
    • 2023-01
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客