前言
本文介绍的是laravel 5.3中自定义加密服务的方案,利用laravel的服务容器,实现自定义加密服务注册(示例是支持长字符串的RSA加密),下面来看看详细的介绍:
创建加密解密服务类
文件地址 /app/Service/Common/CryptService.php 代码如下
下面这个是个人写的支持长字符串的RSA加密类作为示例,自定义加密的话只需更改这个文件的代码就好,其它操作只是为了实现依赖注入。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
<?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 代码如下:
1
2
3
4
5
6
7
8
9
10
|
<?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的声明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<?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中添加
1
2
3
4
5
6
7
|
'providers' => [
\App\Providers\MyCryptServiceProvider:: class ,
],
'aliases' => [
'MyCrypt' => \App\Facades\CryptFacades:: class ,
]
|
编写自定义加密解密服务的配置文件
/config/crypt.php 因为我写的CryptService有用到配置文件,所以需要再添加个配置文件。在实际项目中,可以根据需要自行设置配置文件和加密服务类。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?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文件
1
|
php artisan make:controller IndexController
|
2、编辑IndexController
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
<?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添加路由
1
|
Route::get( '/test' , 'IndexController@test' );
|
4、浏览器访问验证结果
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:https://hanxv.cn/archives/66.html