我已經搜索過用于解決此問題的軟件包或解決方案,并遇到了這個 Stack Overflow 回答和這個 PHP 解決方案,該解決方案基本上是 Stack Overflow 所描述的解決方案的 PHP 實現。
我決定創建一個為 Laravel 設計的擴展包,使用簡單,優雅的語法提供簡單的文件加密 / 解密功能。
在這個教程中,我會詳細描述加密大文件需要的所有步驟。
首先, 使用 Laravel 安裝器創建一個新的 Laravel 項目, 命名為security-app:
laravel new security-app
在撰寫本教程時,我正在使用 Laravel v6.5.2。
因為我們已經使用了 Laravel 安裝程序,所以我們已經生成了一個應用程序密鑰并將其添加到我們的 .env 文件中。 如果您使用其他安裝方法,請不要忘記使用以下方法生成新的應用程序密鑰:
php artisan key:generate
因為我們正在使用 Laravel Valet,所以應該已經為我們創建了 security-app.test 域名。 如果使用其他開發環境,則應添加一個本地域名指向新項目。
由于自 Laravel 6 以來前端腳手架已被移至 Laravel UI 中,因此我們將安裝 laravel/ui 擴展包。
composer require laravel/ui — dev
接下來,我們將安裝bootstrap和auth腳手架:
php artisan ui bootstrap --auth
并編譯所有內容:
npm install npm run dev
我們還需要在 .env 文件中配置數據庫訪問憑據并運行初始遷移:
php artisan migrate
現在,我們可以創建一個新用戶并登錄查看用戶儀表板。
注意:在本演示中,我們將創建一個基本的上傳表單,但是在您的應用程序中,您應該考慮使用更復雜的上傳功能,對大文件使用分塊上傳。
您可以使用一個非常好的擴展包是 pion/laravel-chunk-upload.
Laravel Auth 腳手架為我們創建了一個 /home 路由,一個 HomeController 和一個 home.blade.php 視圖文件。
讓我們編輯 home.blade.php 文件并添加一個表單和一個上傳字段:
form action="{{ route('uploadFile') }}" method="post" enctype="multipart/form-data" class="my-4">
@csrf
div class="form-group">
div class="custom-file">
input type="file" class="custom-file-input" id="userFile" name="userFile">
label class="custom-file-label" for="userFile">Choose a file/label>
/div>
/div>
button type="submit" class="btn btn-primary">Upload/button>
@if (session()->has('message'))
div class="alert alert-success mt-3">
{{ session('message') }}
/div>
@endif
/form>
然后添加相應的路由:
Route::post(‘/home', ‘HomeController@store')->name(‘uploadFile');
在 HomeController 中新增 store 方法。 此方法會將上傳的文件存儲在具有當前用戶 ID 的文件目錄中 (storage/app/files/{user-id}) 。
注意:這是不正確的做法,不應在生產環境中使用。 為了使本教程更加小巧,我們使用文件系統來獲取用戶的文件,但是在生產環境中,需要使用數據庫來跟蹤每個用戶上傳的文件。
?php
/**
* Store a user uploaded file
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
if ($request->hasFile('userFile') $request->file('userFile')->isValid()) {
Storage::putFile('files/' . auth()->user()->id, $request->file('userFile'));
}
return redirect()->route('home')->with('message', 'Upload complete');
}
到了加密用戶上傳文件的階段。我們將安裝file-vault擴展包:
composer require soarecostin/file-vault
該軟件包允許訪問 FileVault 門面, 其中提供了一些用于加密和解密文件的方法,還提供了一些方法來設置選項,例如為每個文件設置不同的加密密鑰,或指定該文件的 Laravel 文件系統磁盤。
我們將使用 FileVault::encrypt($file) 方法來加密用戶上傳的文件。 此功能將刪除原始的未加密文件,并將其替換為具有相同名稱和附加 .enc 擴展名的文件。
如果您想使用不同的名稱命名文件,則可以將所需的名稱作為第二個參數傳遞給 encrypt 方法。 如果您想保留原始文件,可以使用 encryptCopy 方法。
這就是我們的 store 方法現在的樣子:
?php
/**
* Store a user uploaded file
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
if ($request->hasFile('userFile') $request->file('userFile')->isValid()) {
$filename = Storage::putFile('files/' . auth()->user()->id, $request->file('userFile'));
// Check to see if we have a valid file uploaded
if ($filename) {
FileVault::encrypt($filename);
}
}
return redirect()->route('home')->with('message', 'Upload complete');
}
接下來,我們需要查看所有用戶上傳的文件,還需要一種下載它們的方法。
我們將在 HomeController 中創建一個新的 downloadFile 路由和一個新的 downloadFile 方法:
Route::get(‘/files/{filename}', ‘HomeController@downloadFile')->name(‘downloadFile');
?php
/**
* Download a file
*
* @param string $filename
* @return \Illuminate\Http\Response
*/
public function downloadFile($filename)
{
// Basic validation to check if the file exists and is in the user directory
if (!Storage::has('files/' . auth()->user()->id . '/' . $filename)) {
abort(404);
}
return response()->streamDownload(function () use ($filename) {
FileVault::streamDecrypt('files/' . auth()->user()->id . '/' . $filename);
}, Str::replaceLast('.enc', '', $filename));
}
downloadFile 使用 Laravel 原生的 streamDownload response, 接收一個回調.
在回調中,我們正在調用擴展包 FileVault 提供的 streamDecrypt 方法,它將對文件進行解密并將其逐段提供給streamDownload方法,從而允許您的用戶直接下載解密文件。
現在,我們需要在上傳表單下方顯示所有用戶的文件。 為此,我們將 $files 變量從 HomeController 的 index 方法發送到 home.blade.php 視圖文件,并在上傳表格的下面顯示用戶文件。
?php
/**
* Show the application dashboard.
*
* @return \Illuminate\Contracts\Support\Renderable
*/
public function index()
{
$files = Storage::files('files/' . auth()->user()->id);
return view('home', compact('files'));
}
home.blade.php
ul class="list-group">
@forelse ($files as $file)
li class="list-group-item">
a href="{{ route('downloadFile', basename($file)) }}" rel="external nofollow" >
{{ basename($file) }}
/a>
/li>
@empty
li class="list-group-item">You have no files/li>
@endforelse
/ul>
就是這樣! 我們現在在使用靜態加密! 我們創建了供用戶上傳文件的表單,對這些文件進行加密,并且僅在上傳文件的用戶要求時才對其解密。
當然,在生產中,需要采取更多的安全措施,而 FileVault 擴展包旨在這方面為您提供幫助。
如,您可能希望將用戶上傳的大文件存儲在 Amazon S3 中,該擴展包支持文件加密 / 流解密。
您可能還想為每個用戶或每個文件使用不同的加密密鑰,這對于 FileVault 擴展包也是可能的。
以上就是淺談Laravel中如何對大文件進行加密的詳細內容,更多關于Laravel中如何對大文件進行加密的資料請關注腳本之家其它相關文章!
您可能感興趣的文章:- Laravel的加密解密與哈希實例講解
- Laravel 數據庫加密及數據庫表前綴配置方法
- laravel 5.3中自定義加密服務的方案詳解
- Laravel中10個有用的用法小結
- Laravel中的where高級使用方法實例講解
- Laravel 重寫日志,讓日志更優雅
- laravel使用組件實現微信網頁授權登入
- Laravel統一封裝接口返回狀態實例講解