henzeb/laravel-encrypted-data-rotator

v0.3.0-alpha 2024-08-08 06:22 UTC

This package is auto-updated.

Last update: 2024-09-08 06:29:07 UTC


README

Build Status Latest Version on Packagist Total Downloads License

Laravel 11自带应用密钥旋转功能。遗憾的是,在这个阶段,laravel不会重新加密数据,除非用户更改它。

此包允许您默认旋转模型,但也可以让您旋转自己的自定义加密数据。

安装

只需使用以下命令安装。

composer require henzeb/laravel-encrypted-data-rotator

用法

配置

当您只想旋转模型时,无需进行任何修改。所有操作都将自动为您完成。大多数操作可以通过环境变量进行配置。

发布配置

配置文件可以通过以下命令发布

php artisan vendor:publish --tag=rotator

旋转密钥

Laravel没有自带方便的密钥旋转命令,您需要手动在APP_PREVIOUS_KEYS变量中保存密钥,您可能会忘记,或者简单地出错。

php artisan key:rotate

您还可以选择不同的环境。

php artisan key:rotate --env your-env

在生产环境中,如果您想要旋转密钥,将被要求确认。您可以强制执行此操作。

php artisan key:rotate --force

旋转数据

当您旋转了密钥后,加密数据尚未更改。如果当前密钥无法解密数据,Laravel将使用之前的密钥。使用以下命令数据也会被旋转。

php artisan key:rotate-data

对于模型,您无需做任何事情。模型及其加密属性将自动检测。

注意:就像密钥旋转命令一样,key:rotate-data接受env来指定环境,以及force来开始旋转而无需确认。

旋转转换器

如果您在模型中有处理加密数据的转换器,希望它们也被旋转。对于这些情况,您可以使用属性EncryptsData。然后key:rotate-data命令将检测转换器并旋转其数据。

use Henzeb\Rotator\Attributes\EncryptsData;

#[EncryptsData]
public function myAttribute(): Attribute
{
    return Attribute::set(
        fn($value) => encrypt($value)
    )->get(fn($value) => decrypt($value));
}

旋转自定义属性转换

可以旋转自定义转换。您的CastsAttributes实现应该在其类名中包含encrypted,或者实现Henzeb\Rotator\Contracts\CastsEncryptedAttributes接口。

use Henzeb\Rotator\Contracts\CastsEncryptedAttributes;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;


class YourCustomAttribute implements CastsAttributes, CastsEncryptedAttributes
{
    // your implementation
}

注意:这同样适用于CastsInboundAttributes实现

旋转自定义加密数据

要旋转模型无法访问的加密数据,您可以在\Henzeb\Rotator\Contracts\RotatesEncryptedData接口上实现rotateEncryptedData方法。当应用默认配置时,这些实现也会自动检测。

在模型上自定义旋转

RotatesEncryptedData接口也可以应用于模型。这些是per-record基础。

事件

对于每个处理的模型,将发出一个ModelEncryptionRotated事件。它包含模型以便于访问。

注意:对于自定义实现,没有事件。您必须自己实现它们。

队列

所有操作都利用队列完成。默认情况下,它使用默认队列和默认连接。您可以通过设置ROTATOR_QUEUEROTATOR_QUEUE_CONNECTION,或者在配置文件中的相应键来更改这些设置。

为了避免内存不足,给定队列中的作业数量通过ROTATOR_JOB_LIMIT限制。每当队列大小过大时,RotateModelsWithEncryptedData作业将被放回队列中,等待它已分发的作业完成。默认情况下为100个作业。

为避免数据库过载,您可以修改 ROTATOR_CHUNK_SIZE。默认情况下,从您的数据库中取出50条记录并派送到队列。

清理之前的密钥

如果您定期轮换,或者您确信这些密钥不再需要,可以通过运行以下命令来简单地清理密钥

php artisan key:cleanup-previous-keys

注意:与其他命令一样,key:cleanup-previous-keys 接受 env 来指定环境,以及 force 来在不确认的情况下清理。

测试此包

composer test

贡献

有关详细信息,请参阅 CONTRIBUTING

安全

如果您发现任何与安全相关的问题,请通过电子邮件 henzeberkheij@gmail.com 联系,而不是使用问题跟踪器。

致谢

许可证

GNU AGPLv。有关更多信息,请参阅 许可证文件