pmingram/laravel-model-encryptor

一个用于灵活加密和解密数据的模型特性

v1.0.0 2021-01-16 10:21 UTC

This package is auto-updated.

Last update: 2024-09-16 18:30:59 UTC


README

Software License PHP Version Latest Version on Packagist

一个用于灵活加密和解密数据的模型特性

安装

您可以通过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)。有关更多信息,请参阅许可证文件