laravel 5.3中自定义加密服务的方案详解


Posted in PHP onMay 09, 2017

前言

本文介绍的是laravel 5.3中自定义加密服务的方案,利用laravel的服务容器,实现自定义加密服务注册(示例是支持长字符串的RSA加密),下面来看看详细的介绍:

创建加密解密服务类

文件地址 /app/Service/Common/CryptService.php 代码如下

下面这个是个人写的支持长字符串的RSA加密类作为示例,自定义加密的话只需更改这个文件的代码就好,其它操作只是为了实现依赖注入。

<?php
namespace App\Service\Common;
class CryptService
{
 public $config,$keypath, $prikey_path, $pubkey_path, $prikey, $pubkey , $private_key_size;

 public function select($select = 'rsa_api')
 {
  $config = config('crypt');
  if (array_key_exists($select, $config)) {
   $this->config = $config[$select];
   $this->private_key_size = $this->config['openssl_config']['private_key_bits'];
  } else {
   return false;
  }
  $this->keypath = dirname(dirname(dirname(__DIR__))) . $this->config['path'];
  if(!file_exists($this->keypath)){
   mkdir($this->keypath,"0777",true);
  }
  $this->prikey_path = $this->keypath . $this->config['private_key_file_name'];
  $this->pubkey_path = $this->keypath . $this->config['public_key_file_name'];
  if (file_exists($this->prikey_path))
   $this->prikey = file_get_contents($this->prikey_path);
  if (file_exists($this->pubkey_path))
   $this->pubkey = file_get_contents($this->pubkey_path);
  return $this;
 }

 public function makeKey()
 {
  $res = openssl_pkey_new($this->config['openssl_config']);
  openssl_pkey_export($res, $this->prikey);
  file_put_contents($this->prikey_path, $this->prikey);
  $pubkey = openssl_pkey_get_details($res);
  $this->pubkey = $pubkey['key'];
  file_put_contents($this->pubkey_path, $this->pubkey);
  return $test = ['prikey' => $this->prikey, 'pubkey' => $this->pubkey];
 }

 public function encryptPrivate($data){
  $crypt = $this->encrypt_split($data);
  $crypted = '';
  foreach ($crypt as $k=>$c){
   if($k!=0) $crypted.="@";
   $crypted.=base64_encode($this->doEncryptPrivate($c));
  }
  return $crypted;
 }
 public function encryptPublic($data){
  $crypt = $this->encrypt_split($data);
  $crypted = '';
  foreach ($crypt as $k=>$c){
   if($k!=0) $crypted.="@";
   $crypted.=base64_encode($this->doEncryptPublic($c));
  }
  return $crypted;
 }

 public function decryptPublic($data){
  $decrypt = explode('@',$data);
  $decrypted = "";
  foreach ($decrypt as $k=>$d){
   $decrypted .= $this->doDecryptPublic(base64_decode($d));
  }
  return $decrypted;
 }
 public function decryptPrivate($data){
  $decrypt = explode('@',$data);
  $decrypted = "";
  foreach ($decrypt as $k=>$d){
   $decrypted .= $this->doDecryptPrivate(base64_decode($d));
  }
  return $decrypted;
 }
 private function encrypt_split($data){
  $crypt=[];$index=0;
  for($i=0; $i<strlen($data); $i+=117){
   $src = substr($data, $i, 117);
   $crypt[$index] = $src;
   $index++;
  }
  return $crypt;
 }
 private function doEncryptPrivate($data)
 {
  $rs = '';
  if (@openssl_private_encrypt($data, $rs, $this->prikey) === FALSE) {
   return NULL;
  }
  return $rs;
 }

 private function doDecryptPrivate($data)
 {
  $rs = '';
  if (@openssl_private_decrypt($data, $rs, $this->prikey) === FALSE) {
   return null;
  }
  return $rs;
 }
 private function doEncryptPublic($data){
  $rs = '';
  if (@openssl_public_encrypt($data, $rs, $this->pubkey) === FALSE) {
   return NULL;
  }
  return $rs;
 }
 private function doDecryptPublic($data)
 {
  $rs = '';
  if (@openssl_public_decrypt($data, $rs, $this->pubkey) === FALSE) {
   return null;
  }
  return $rs;
 }
}

创建门面facades

文件地址 /app/Facades/CryptFacades.php 代码如下:

<?php
namespace App\Facades;
use \Illuminate\Support\Facades\Facade;

class CryptFacades extends Facade{
 public static function getFacadeAccessor()
 {
  return 'MyCrypt';
 }
}

注册服务

创建文件 /app/Providers/MyCryptServiceProvider.php 代码如下:

其实也可以在AppServiceProvider中注册,就不用另外建个MyCryptServiceProvider.php文件了

而且在/config/app.php中一般也已经有了AppServiceProvider的声明

<?php
namespace App\Providers;

use App\Service\Common\CryptService;
use Illuminate\Support\ServiceProvider;

class MyCryptServiceProvider extends ServiceProvider
{
 /**
  * Bootstrap the application services.
  *
  * @return void
  */
 public function boot()
 {
  //
 }

 /**
  * Register the application services.
  *
  * @return void
  */
 public function register()
 {
  \App::bind('MyCrypt',CryptService::class);
 }
}

在配置中声明

文件地址 /config/app.php 在providershe和aliases中添加

'providers' => [
 \App\Providers\MyCryptServiceProvider::class,
],

'aliases' => [
 'MyCrypt' => \App\Facades\CryptFacades::class,
]

编写自定义加密解密服务的配置文件

/config/crypt.php 因为我写的CryptService有用到配置文件,所以需要再添加个配置文件。在实际项目中,可以根据需要自行设置配置文件和加密服务类。

<?php
//基于laravel根目录,分隔符最好是用 DIRECTORY_SEPARATOR 常量代替
return [
 'rsa_api' => [
  'path'=>DIRECTORY_SEPARATOR.'storage'.DIRECTORY_SEPARATOR.'rsakey'.DIRECTORY_SEPARATOR,
  'private_key_file_name'=>'private_key.pem',
  'public_key_file_name' =>'public_key.pem',
  'openssl_config'=>[
   "digest_alg" => "sha512",
   "private_key_bits" => 1024,
   "private_key_type" => OPENSSL_KEYTYPE_RSA,
  ]
 ],
 'rsa_data'=>[
  'path'=>DIRECTORY_SEPARATOR.'storage'.DIRECTORY_SEPARATOR.'rsakey'.DIRECTORY_SEPARATOR,
  'private_key_file_name'=>'private.pem',
  'public_key_file_name' =>'public.pem',
  'openssl_config'=>[
   "digest_alg" => "sha512",
   "private_key_bits" => 1024,
   "private_key_type" => OPENSSL_KEYTYPE_RSA,
  ]
 ]
];

在Controller中使用的示例

1、artisan创建Controller文件

php artisan make:controller IndexController

2、编辑IndexController

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use MyCrypt;
class IndexController extends Controller{

 public function test(){
  $crypt = MyCrypt::select('rsa_api');
  $crypt->makeKey();
  $short = "abcd";
  $long = "
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

  $req['short'] = $short;
  $req['short_private_encrypt'] = $crypt->encryptPrivate($short);
  $req['short_public_decrypt'] = $crypt->decryptPublic($req['short_private_encrypt']);

  $req['long'] = $long;
  $req['long_private_encrypt'] = $crypt->encryptPrivate($long);
  $req['long_public_decrypt'] = $crypt->decryptPublic($req['long_private_encrypt']);
  dump($req);
  //dd($req);
 }
}

3、在/routes/web.php添加路由

Route::get('/test', 'IndexController@test');

4、浏览器访问验证结果

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
Apache2 httpd.conf 中文版
Dec 06 PHP
可定制的PHP缩略图生成程式(需要GD库支持)
Mar 06 PHP
Apache 配置详解(最好的APACHE配置教程)
Jul 04 PHP
shopex主机报错误请求解决方案(No such file or directory)
Dec 27 PHP
php提交表单发送邮件的方法
Mar 20 PHP
PHP MVC框架路由学习笔记
Mar 02 PHP
php登录超时检测功能实例详解
Mar 21 PHP
PHP长网址与短网址的实现方法
Oct 13 PHP
Laravel中unique和exists验证规则的优化详解
Jan 28 PHP
PHP实现提高SESSION响应速度的几种方法详解
Aug 09 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
Oct 15 PHP
Jsonp劫持学习
Apr 01 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
May 09 #PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
May 08 #PHP
ThinkPHP实现图片上传操作的方法详解
May 08 #PHP
PHP开发中csrf攻击的简单演示和防范
May 07 #PHP
ThinkPHP框架实现数据增删改
May 07 #PHP
thinkphp 验证码 的使用小结
May 07 #PHP
解析 thinkphp 框架中的部分方法
May 07 #PHP
You might like
destoon实现底部添加你是第几位访问者的方法
2014/07/15 PHP
javascript入门·图片对象(无刷新变换图片)\滚动图像
2007/10/01 Javascript
用于节点操作的API,颠覆原生操作HTML DOM节点的API
2010/12/11 Javascript
JavaScript打字小游戏代码
2011/12/26 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
IE中document.createElement的iframe无法设置属性name的解决方法
2015/09/14 Javascript
基于JavaScript获取鼠标位置的各种方法
2015/12/16 Javascript
原生js实现百叶窗效果及原理介绍
2016/04/12 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
2016/10/13 Javascript
angular项目中bootstrap-datetimepicker时间插件的使用示例
2018/03/15 Javascript
关于jquery layui弹出层的使用方法
2018/04/21 jQuery
angular6.0开发教程之如何安装angular6.0框架
2018/06/29 Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
2018/07/17 Javascript
javascript面向对象程序设计实践常用知识点总结
2019/07/29 Javascript
一起写一个即插即用的Vue Loading插件实现
2019/10/31 Javascript
python远程登录代码
2008/04/29 Python
python中常用的九种预处理方法分享
2016/09/11 Python
详解Python函数可变参数定义及其参数传递方式
2017/08/02 Python
python 二分查找和快速排序实例详解
2017/10/13 Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
2017/11/16 Python
使用python获取电脑的磁盘信息方法
2018/11/01 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
2020/05/26 Python
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
安全资料员岗位职责
2013/12/14 职场文书
小学生保护环境倡议书
2014/05/15 职场文书
清明节演讲稿
2014/05/27 职场文书
公司门卫岗位职责范本
2014/07/08 职场文书
红领巾广播站广播稿
2014/10/19 职场文书
党员评议个人总结
2014/10/20 职场文书
2014年专项整治工作总结
2014/11/17 职场文书
税务会计岗位职责
2015/04/02 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
2015年中学图书馆工作总结
2015/07/22 职场文书
导游词之贵州百里杜鹃
2019/10/29 职场文书