1. 程式人生 > 程式設計 >淺談Laravel中如何對大檔案進行加密

淺談Laravel中如何對大檔案進行加密

我已經搜尋過用於解決此問題的軟體包或解決方案,並遇到了這個 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',‘HomeControozDvpqVgkller@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(http://www.cppcns.com'home')->with('message','Upload complete');
    }

到了加密使用者上傳檔案的階段。我們將安裝file-vault擴充套件包:

composer require soarecostin/file-vault

該軟體包允許訪問 FileVault 門面, 其中提供了一些用於加密和解密檔案的方法,還提供了一些方法來設定選項,例如為每個檔案設定不同的加密金鑰,或指定該檔案的 Laravel 檔案系統磁碟。

我們將使用 FileVault::encrypt($file) 方法來加密使用者上傳的檔案。 此功能將刪除原始的未加密檔案,並將其替換為具有相同名稱和附加 .enc 副檔名的檔案。

如果您想使用不同的名稱命名檔案,則可以將所需的名稱作為第二個引數傳遞給 encrypt 方法。 如果您想保留原始檔案,可以使用 encryozDvpqVgkptCopy 方法。

這就是我們的 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中如何對大檔案進行加密的資料請關注我們其它相關文章!