simon80119 / laravel-database-encryption
使用 Eloquent 自动加密和解密数据库
Requires (Dev)
- orchestra/testbench: ^6.0
- phpunit/phpunit: ^9.4
README
使用 openssl 加密和解密 Laravel 模型属性的包
主要特性
- 轻松加密和解密数据库字段
- 最小化配置
- 使用以下方式包含搜索加密数据:
whereEncrypted
和orWhereEncrypted
- 使用 openssl 加密和解密字段
要求
- Laravel: >= 5
- PHP: >= 7.3
模式要求
加密值通常比纯文本值长,有时长得多。您可能发现数据库表中列的宽度需要更改以存储此包生成的加密值。
我们强烈建议将列类型更改为 TEXT
或 LONGTEXT
安装
步骤 1: Composer
通过 Composer 命令行
$ composer require elgibor-solution/laravel-database-encryption
步骤 2: 将 ServiceProvider 添加到您的 app/config.php 文件中(Laravel 5.4 或以下版本)
将服务提供者添加到 config/app.php 配置文件中的 providers 数组中,如下所示
'providers' => [ ... \ESolution\DBEncryption\Providers\DBEncryptionServiceProvider::class, ],
使用方法
在您希望应用加密的任何 Eloquent 模型中使用 EncryptedAttribute
特性,并定义一个包含要加密的属性列表的 protected $encrypted
数组。
例如
use ESolution\DBEncryption\Traits\EncryptedAttribute; class User extends Eloquent { use EncryptedAttribute; /** * The attributes that should be encrypted on save. * * @var array */ protected $encryptable = [ 'first_name', 'last_name' ]; }
通过包含 EncryptedAttribute
特性,Eloquent 提供的 setAttribute()
、getAttribute()
和 getAttributeFromArray()
方法被重写以包含一个额外的步骤。
搜索加密字段示例
可以通过调用与 Laravel Eloquent where
和 orWhere
相似的 whereEncrypted
和 orWhereEncrypted
函数来搜索加密字段。
namespace App\Http\Controllers; use App\User; class UsersController extends Controller { public function index(Request $request) { $user = User::whereEncrypted('first_name','john') ->orWhereEncrypted('last_name','!=','Doe')->firstOrFail(); return $user; } }
加密当前数据
如果您数据库中有当前数据,可以使用: php artisan encryptable:encryptModel 'App\User'
命令对其进行加密。
此外,您还可以使用: php artisan encryptable:decryptModel 'App\User'
命令进行解密。
注意:您必须首先实现 Encryptable
特性并设置 $encryptable
属性
存在性和唯一性验证规则
如果您正在使用存在性和唯一性规则与加密值,请将其替换为 exists_encrypted
和 unique_encrypted
常见问题解答
我可以搜索加密数据吗?
YES! 由于您将能够搜索由此包加密的属性,因此可以搜索加密数据。如果您需要搜索数据,请使用 whereEncrypted
和 orWhereEncrypted
函数。
User::whereEncrypted('email','test@gmail.com')->orWhereEncrypted('email','test2@gmail.com')->firstOrFail();
一旦模型使用 EncryptedAttribute
,它将自动添加到 Eloquent 中。
我可以加密我的 User
模型的所有数据吗?
除了 IDs 之外,您可以加密任何您想要的内容。
例如:在加密的电子邮件上登录
$user = User::whereEncrypted('email','test@gmail.com')->filter(function ($item) use ($request) {
return Hash::check($password, $item->password);
})->where('active',1)->first();
致谢
此包受到了以下灵感的启发:austinheap/laravel-database-encryption magros/laravel-model-encryption DustApplication/laravel-database-model-encryption
许可证
MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件。