国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

laravel 5.3中自定義加密服務(wù)的方案詳解

2024-05-04 23:57:11
字體:
供稿:網(wǎng)友

前言

本文介紹的是laravel 5.3中自定義加密服務(wù)的方案,利用laravel的服務(wù)容器,實(shí)現(xiàn)自定義加密服務(wù)注冊(cè)(示例是支持長字符串的RSA加密),下面來看看詳細(xì)的介紹:

創(chuàng)建加密解密服務(wù)類

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

下面這個(gè)是個(gè)人寫的支持長字符串的RSA加密類作為示例,自定義加密的話只需更改這個(gè)文件的代碼就好,其它操作只是為了實(shí)現(xiàn)依賴注入。

<?phpnamespace 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; }}

創(chuàng)建門面facades

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

<?phpnamespace App/Facades;use /Illuminate/Support/Facades/Facade;class CryptFacades extends Facade{ public static function getFacadeAccessor() {  return 'MyCrypt'; }}

注冊(cè)服務(wù)

創(chuàng)建文件 /app/Providers/MyCryptServiceProvider.php 代碼如下:

其實(shí)也可以在AppServiceProvider中注冊(cè),就不用另外建個(gè)MyCryptServiceProvider.php文件了

而且在/config/app.php中一般也已經(jīng)有了AppServiceProvider的聲明

<?phpnamespace 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,]

編寫自定義加密解密服務(wù)的配置文件

/config/crypt.php 因?yàn)槲覍懙腃ryptService有用到配置文件,所以需要再添加個(gè)配置文件。在實(shí)際項(xiàng)目中,可以根據(jù)需要自行設(shè)置配置文件和加密服務(wù)類。

<?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創(chuàng)建Controller文件

php artisan make:controller IndexController

2、編輯IndexController

<?phpnamespace 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、瀏覽器訪問驗(yàn)證結(jié)果

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到PHP教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 长葛市| 巴楚县| 措勤县| 邢台县| 裕民县| 青岛市| 孟连| 开平市| 新兴县| 铁岭市| 泊头市| 屏山县| 武宣县| 团风县| 兴隆县| 泰安市| 晋宁县| 彰武县| 兴义市| 蓬莱市| 东源县| 佛冈县| 石门县| 遵义县| 山阳县| 双城市| 荥阳市| 洪江市| 郁南县| 六枝特区| 清徐县| 成安县| 武鸣县| 夏邑县| 齐河县| 珠海市| 额敏县| 晴隆县| 永寿县| 无极县| 麻阳|