浅谈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', ‘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中如何对大文件进行加密的资料请关注猪先飞其它相关文章!
相关文章
- 如果我们需要安培Laravel4的话最php最低要求要在php5.3.7版本并且我们需要把mcrypt与openss这两个扩展开启才可以,具体步骤我们参考下文。 前面我们介绍我了 com...2016-11-25
Laravel 调试工具 laravel-debugbar 打印日志消息
laravel-debugbar 调试工具的教程小编整理了几篇不错的教程,今天我们来看一篇Laravel 调试工具 laravel-debugbar 打印日志消息例子,希望文章对各位有帮助。 其实不...2016-11-25Laravel 5.1中定义事件、事件监听器以及触发事件例子
下文我们来看一篇关于Laravel 5.1中定义事件、事件监听器以及触发事件例子,希望能够帮助到各位新手朋友的哦。 这里我们基于之前基于模型+缓存对文章增删改查这篇...2016-11-25- Laravel框架我们用到的不多了,但如果使用需要搭配了,下面我们来看一篇关于搭建php Laravel框架教程详解,具体的操作细节如下所示,希望对各位有帮助。 一、安装 Compos...2016-11-25
- 你可能想创建一个在应用的任何地方都可以访问的函数,这个篇文章将带你解决此问题,感兴趣的同学,可以参考下。...2021-05-27
- Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁...2016-11-25
- 数据表之间是纵横交叉、相互关联的,laravel的一对一,一对多比较好理解,本文重点通过实例给大家讲解 laravel中的多对多关系,感兴趣的朋友一起看看吧 数据表之间是纵...2017-07-06
- 本文给大家讲解的是在laravel中是怎么实现autoload的?分析之后才发现,真的是很巧妙,下面就来给大家详细说明下...2017-05-21
- Laravel的主要技术特点:1、Bundle是Laravel的扩展包组织形式或称呼。Laravel的扩展包仓库已经相当成熟了,可以很容易的帮你把扩展包(bundle)安装到你的应用中。你可以选择下载一个扩展包(bundle)然后拷贝到bundles目录,或者...2015-10-21
PHP框架Laravel中实现supervisor执行异步进程的方法
这篇文章主要给大家介绍了PHP框架Laravel中实现supervisor执行异步进程的方法,文中介绍的非常详细,相信对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。...2017-06-11laravel Eloquent模型创建、更新及批量赋值详解
下面我们来看一篇关于laravel Eloquent模型创建、更新及批量赋值详解,希望文章能够让各位清楚的了解Eloquent模型的基本知识的哦。 1、创建模型 1.1 使用save方...2016-09-14- 数据表之间是纵横交叉、相互关联的,laravel的一对一,一对多比较好理解,本文重点通过实例给大家讲解 laravel中的多对多关系,感兴趣的朋友一起看看吧...2017-06-11
- 这篇文章主要介绍了laravel 表单验证实现多个字段组合后唯一,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-06
- Laravel是一套简洁、优雅的PHP Web开发框架 (PHP Web Framework) 。在世界(不含中国)PHP框架的占有率超过40%。自从接触PHP以来一直使用Yii,感觉Yii实现功能比较简单,是一个很不错的框架。最近由于工作的原因开始研究Lar...2015-10-30
在laravel中使用Symfony的Crawler组件分析HTML
这篇文章主要介绍了在laravel中使用Symfony的Crawler组件分析HTML,需要的朋友可以参考下...2017-06-20- 多对多就相当于一个专题Topic有多个文章,但是这多个文章又属于多个专题,下面这篇文章主要给大家介绍了关于laravel多对多关联模型的相关资料,需要的朋友可以参考下...2021-08-11
- 这篇文章主要介绍了Laravel的加密解密与哈希实例讲解,加密解密的知识,对于代码安全还是比较重要的,有感兴趣的同学可以学习下...2021-03-20
- 这篇文章主要介绍了laravel日志优化实例讲解,日志是查找代码问题的重要的文件,有感兴趣的同学可以学习下...2021-03-19
- 这篇文章主要介绍了laravel5.2实现区分前后台用户登录的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2017-01-15
- 这篇文章主要介绍了Laravel 修改验证异常的响应格式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-05-26