加入收藏 | 设为首页 | 会员中心 | 我要投稿 商洛站长网 (https://www.0914zz.com/)- AI应用、CDN、边缘计算、云计算、物联网!
当前位置: 首页 > 编程开发 > PHP > 正文

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

发布时间:2020-12-05 02:15:51 所属栏目:PHP 来源:互联网
导读:这篇文章主要给大家介绍了在laravel 5.3中自定义加密服务的相关资料,文中介绍的非常详细,对大家学习或者使用laravel 5.3具有一定的参考学习价值,需要的朋友们下面来一起看看吧。

前言

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

创建加密解密服务类

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

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

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,$this->prikey) === FALSE) {
return null;
}
return $rs;
}
private function doEncryptPublic($data){
$rs = '';
if (@openssl_public_encrypt($data,$this->pubkey) === FALSE) {
return NULL;
}
return $rs;
}
private function doDecryptPublic($data)
{
$rs = '';
if (@openssl_public_decrypt($data,$this->pubkey) === FALSE) {
return null;
}
return $rs;
}
}

创建门面facades

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

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

注册服务

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

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

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

use AppServiceCommonCryptService;
use IlluminateSupportServiceProvider;

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中添加

    [ AppProvidersMyCryptServiceProvider::class,],'aliases' => [ 'MyCrypt' => AppFacadesCryptFacades::class,]

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

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

    [ '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',] ] ];

    在Controller中使用的示例

    1、artisan创建Controller文件

    2、编辑IndexController

use IlluminateHttpRequest;
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添加路由

4、浏览器访问验证结果

总结

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

(编辑:商洛站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读