前言
本文介绍的是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