pmingram / laravel-model-encryptor
一个用于灵活加密和解密数据的模型特性
v1.0.0
2021-01-16 10:21 UTC
Requires
- php: >=7.0
README
一个用于灵活加密和解密数据的模型特性
安装
您可以通过composer安装此包
composer require pmingram/laravel-model-encryptor
使用和配置
此包是一个特性,可以添加到您希望应用加密的任何Laravel模型中
use PmIngram\Laravel\ModelEncryptor\HasEncryption; class ModelName extends Model { use HasEncryption; }
默认情况下,该特性将在创建任何记录时应用加密 - 但要实际加密数据,您需要在模型中配置一些属性
这些属性没有特定的作用域要求,但建议使用一个protected
作用域。
加密和解密
模型可以通过简单的调用方法轻松地进行加密和解密
$model->encrypt(); $model->decrypt();
这将加密或解密当前模型实例中的数据,但不会将更改持久化到数据库中。这在您希望解密数据以进行展示(例如,在视图中或在API端点的资源中)但希望将数据在数据库中保持加密的情况下特别有用。
要持久化到数据库,只需在方法中传递一个可选的true
参数
$model->encrypt(true); $model->decrypt(true);
示例配置
模型
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use PmIngram\Laravel\ModelEncryptor\HasEncryption; class ExampleModel extends Model { use HasEncryption, HasFactory; protected $encryptOnCreate = true; protected $encryptionKey = ''; protected $encryptionSaltColumn = 'column_b'; protected $encryptionColumnKeys = [ 'column_c', 'column_e', ]; protected $fillable = [ 'column_a', 'column_b', 'column_c', 'column_d', 'column_e', ]; public function __construct(array $attributes = []) { $this->encryptionKey = config('encryptionkeys.model.example'); parent::__construct($attributes); } }
Laravel配置文件 - "encryptionkeys.php"
<?php return [ 'models' => [ 'example' => env('ENCKEY_MODEL_EXAMPLE', null), ] ];
环境变量 (.env)
ENCKEY_MODEL_EXAMPLE=somerandomstring
关于加密密钥和安全的建议
虽然完全可以在模型中存储模型级别的加密密钥,将其作为字符串存储在$encryptionKey
属性中,但强烈建议像上面示例那样将其抽象到配置文件中,然后使用.env
文件设置字符串。
在代码库中存储加密密钥和密码既是不良做法也是安全风险,特别是当该代码库持久化到VCS(如Git或SVN)时。
重要提示
此特性使用Laravel应用程序密钥。如果更改应用程序密钥,则任何加密数据都将无法读取。当然,这是任何加密方案部署时的常见情况,但如果您需要更改应用程序的密钥,应予以考虑。
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。