tiknil / file-vault
Requires
- php: ^7.2|^8.0
- illuminate/support: 5.8.* || 6.*.* || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0
Requires (Dev)
- orchestra/testbench: ^5.0|^6.0|^7.0
- phpunit/phpunit: ^8.0|^9.0
This package is auto-updated.
Last update: 2024-09-04 16:47:05 UTC
README
⚠️ 这是一个 soarecostin/file-vault 的分支 ⚠️
我们分支了此仓库,因为项目处于废弃状态,以便修复我们遇到的一些问题
- 修复 S3 故障,返回不同预期大小的数据块
- 添加 Laravel 9,PHP 8 和 Flysystem v23 支持
有关已打开和关闭问题的历史,请参阅原始仓库
命名空间已从 Soarecostin/FileVault
更改为 Tiknil/FileVault
,以便并行使用两个版本
使用此包,您可以在 Laravel 项目中加密和解密任何大小的文件。此包使用流和 CBC 加密,一次加密/解密数据段。
安装和使用
此包需要 PHP 7.2 和 Laravel 5.8 或更高版本。
您可以通过 composer 安装原始包
composer require soarecostin/file-vault
或通过在 composer.json 中添加对 github 仓库的引用安装此分支
"repositories": [ { "type": "vcs", "url": "https://github.com/tiknil/file-vault" } ],
然后
composer require tiknil/file-vault
用法
教程
有关如何使用此包在 Laravel 中加密文件的详细说明,请参阅以下文章
描述
此包将自动注册一个名为 FileVault
的外观。使用 Laravel Storage
的 FileVault
外观允许您指定一个 disk
,就像您通常在处理 Laravel Storage 一样。您将传递给包加密/解密函数的所有文件名/路径都相对于磁盘根目录。默认情况下使用 local
磁盘,但您可以在每次调用 FileVault
的方法时指定不同的磁盘,或者通过发布此包的配置文件将默认磁盘设置为其他磁盘。
如果您想更改默认的 disk
或更改用于加密的 key
/cipher
,您可以发布配置文件
php artisan vendor:publish --provider="SoareCostin\FileVault\FileVaultServiceProvider"
这是发布文件的包含内容
return [ /* * The default key used for all file encryption / decryption * This package will look for a FILE_VAULT_KEY in your env file * If no FILE_VAULT_KEY is found, then it will use your Laravel APP_KEY */ 'key' => env('FILE_VAULT_KEY', env('APP_KEY')), /* * The cipher used for encryption. * Supported options are AES-128-CBC and AES-256-CBC */ 'cipher' => 'AES-256-CBC', /* * The Storage disk used by default to locate your files. */ 'disk' => 'local', ];
加密文件
encrypt
方法将搜索文件,加密它并将其保存到同一目录,同时删除原始文件。
public function encrypt(string $sourceFile, string $destFile = null, $deleteSource = true)
encryptCopy
方法将搜索文件,加密它并将其保存到同一目录,同时保留原始文件。
public function encryptCopy(string $sourceFile, string $destFile = null)
示例
以下示例将在 local
磁盘上搜索 file.txt
,将加密文件保存为 file.txt.enc
并删除原始 file.txt
FileVault::encrypt('file.txt');
您也可以指定不同的 disk
,就像您通常使用 Laravel Storage
外观一样
FileVault::disk('s3')->encrypt('file.txt');
您也可以通过传递第二个参数指定加密文件的名称。以下示例将在 local
磁盘上搜索 file.txt
,将加密文件保存为 encrypted.txt
并删除原始 file.txt
FileVault::encrypt('file.txt', 'encrypted.txt');
以下示例与上述示例效果相同,唯一的不同是原始文件不会被删除
// save the encrypted copy to file.txt.enc FileVault::encryptCopy('file.txt'); // or save the encrypted copy with a different name FileVault::encryptCopy('file.txt', 'encrypted.txt');
解密文件
decrypt
方法将搜索文件,解密它并将其保存到同一目录,同时删除加密文件。
public function decrypt(string $sourceFile, string $destFile = null, $deleteSource = true)
decryptCopy
方法将搜索一个文件,解密它并将解密后的文件保存在相同的目录下,同时保留加密文件。
public function decryptCopy(string $sourceFile, string $destFile = null)
示例
以下示例将在 local
磁盘中搜索 file.txt.enc
文件,将解密后的文件保存为 file.txt
,并删除加密文件 file.txt.enc
FileVault::decrypt('file.txt.enc');
如果需要解密的文件不以 .enc
扩展名结尾,解密后的文件将以 .dec
扩展名保存。以下示例将在 local
磁盘中搜索 encrypted.txt
文件,将解密后的文件保存为 encrypted.txt.dec
并删除加密文件 encrypted.txt
FileVault::decrypt('encrypted.txt');
与加密一样,您也可以指定不同的 disk
,就像您通常使用 Laravel 的 Storage
门面一样
FileVault::disk('s3')->decrypt('file.txt.enc');
您也可以通过传入第二个参数来指定解密文件的不同的名称。以下示例将在 local
磁盘中搜索 encrypted.txt
文件,将解密后的文件保存为 decrypted.txt
并删除原始文件 encrypted.txt
FileVault::decrypt('encrypted.txt', 'decrypted.txt');
以下示例都达到了与上面相同的结果,唯一的区别是原始(加密)文件没有被删除
// save the decrypted copy to file.txt while preserving file.txt.enc FileVault::decryptCopy('file.txt.enc'); // or save the decrypted copy with a different name, while preserving the file.txt.enc FileVault::decryptCopy('file.txt.enc', 'decrypted.txt');
流式传输解密文件
有时您可能只想允许用户下载解密文件,但不需要存储实际的解密文件。为此,您可以使用 streamDecrypt
函数,该函数将解密文件并将其写入 php://output
流。您可以使用 Laravel 的 streamDownload
方法(自 5.6 版本起可用)来生成可下载的响应
return response()->streamDownload(function () { FileVault::streamDecrypt('file.txt') }, 'laravel-readme.md');
为每个文件使用不同的密钥
您可能需要使用不同的密钥来加密文件。您可以使用 key
方法显式指定用于加密的密钥。
FileVault::key($encryptionKey)->encrypt('file.txt');
请注意,加密密钥的长度必须为 16 字节,用于 AES-128-CBC
密文,为 32 字节,用于 AES-256-CBC
密文。
您可以使用 generateKey
方法生成具有正确长度(基于配置文件中指定的密文)的密钥
$encryptionKey = FileVault::generateKey();
测试
使用以下命令运行测试:
composer test
变更日志
有关最近更改的更多信息,请参阅 CHANGELOG
贡献
有关详细信息,请参阅 CONTRIBUTING
安全
如果您发现任何与安全相关的问题,请通过电子邮件 soarecostin@gmail.com 而不是使用问题跟踪器。
致谢
许可证
MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件
Laravel 包模板
此包是使用 Laravel 包模板 生成的。