vkn999/eloquentencryption

允许使用4096位RSA私钥对Eloquent属性进行加密和解密。

v4.0 2022-04-29 11:02 UTC

README

此包在处理敏感数据时提供了额外的安全层。允许数据库中Eloquent模型的键字段在静止状态下进行加密。

Latest Version on Packagist Build Status Quality Score Total Downloads

简介

这个开源包满足了加密数据库中选定模型数据的需求,同时允许您旋转app:key。当需要存储私有详细信息时,此包比默认的Laravel加密器提供了更高的安全性。它使用默认的4096位RSA密钥安全地加密您的数据,并使用Laravel模型铸造来动态加密和解密键字段。

通常,您会使用 Laravel的Encrypter 来加密数据,但它使用app:key作为私有密钥的限制。因为app密钥也保护会话/cookie数据,所以建议您经常更换它 - 如果您使用这种方法存储加密数据,您必须首先解密所有数据,并在执行此操作时重新加密。因此,此包通过创建一个独立的更强加密过程,允许您旋转app:key,从而提高了安全性。这允许在您的Laravel应用程序和数据库中敏感模型数据的安全级别。

如果您不想使用RSA密钥,那么我还有一个包 Eloquent AES,它使用一个单独的密钥eloquent_key,并使用AES-256-CBC进行加密。

安装

此包需要Laravel 9.x或更高版本。php: "^8.0|^8.1"

您可以通过composer安装此包

composer require vkn999/eloquentencryption

您不需要注册ServiceProvider,因为此包使用Laravel Package自动发现。迁移蓝图助手使用宏添加,因此不会影响模式文件。

您可以使用此命令发布配置,如果需要更改RSA密钥大小、存储路径和密钥文件名。

php artisan vendor:publish --provider="RichardStyles\EloquentEncryption\EloquentEncryptionServiceProvider" --tag="config"

为了加密和解密数据,您需要为此包生成RSA密钥。默认情况下,这将创建4096位RSA密钥到您的storage/目录。 请勿将这些添加到版本控制并相应地备份。

php artisan encrypt:generate

⚠️ 如果您重新运行此命令,您将失去对任何加密数据的访问权限 ⚠️

还有一个辅助函数可以在迁移中定义您的加密字段。为此函数正常工作不需要任何特殊操作,只需在迁移文件中声明一个encrypted列类型即可。这仅创建一个binary/blob列来存储加密数据。使用此辅助函数表示在查看迁移时该字段已加密。

Schema::create('sales_notes', function (Blueprint $table) {
    $table->increments('id');
    $table->encrypted('private_data');
    $table->encrypted('optional_private_data')->nullable();
    $table->timestamps();
});

您可以使用任何额外的蓝图助手,例如->nullable(),如果没有初始加密数据。建议不要在这些二进制字段上放置->index(),因为您不应该查询这些字段,因为它们已加密。

3.x版本的使用

从3.x版本开始,对laravel的要求是8.14。此版本向基Eloquent Model添加了Model::encryptUsing()静态函数。这允许内置的加密铸造过程使用任何Illuminate\Contracts\Encryption\Encrypter类。

在升级前,请使用任何现有的密钥和数据进行测试 否则您的数据可能无法按预期解密。如果您正在使用 2.x 版本,您不应看到任何问题,因为这个版本遵循了 encryptUsing 静态函数所需的 Encrypter Contract。

在您的 AppServiceProvider 中

EncryptedCast::encryptUsing(new \RichardStyles\EloquentEncryption\EloquentEncryption);

然后在您的模型上,根据需要使用内置的加密转换。

class EncryptedCast extends Model
{
    public $casts = [
        'secret' => 'encrypted',
        'secret_array' => 'encrypted:array',
        'secret_json' => 'encrypted:json',
        'secret_object' => 'encrypted:object',
        'secret_collection' => 'encrypted:collection',
    ];
}

这是通过 PR 实现的,由 @hivokas 提交给 Laravel。

2.x 版本的使用

此包利用 Laravel 自己的 自定义转换 来编码/解码值。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use RichardStyles\EloquentEncryption\Casts\Encrypted;
use RichardStyles\EloquentEncryption\Casts\EncryptedInteger;
use RichardStyles\EloquentEncryption\Casts\EncryptedFloat;
use RichardStyles\EloquentEncryption\Casts\EncryptedCollection;
use RichardStyles\EloquentEncryption\Casts\EncryptedBoolean;

class SalesData extends Model
{
    /**
     * The attributes that should be cast.
     *
     * @var array
     */
    protected $casts = [
        'private_data' => Encrypted::class,
        'private_int' => EncryptedInteger::class,
        'private_float' => EncryptedFloat::class,
        'private_collection' => EncryptedCollection::class,
        'private_boolean' => EncryptedBoolean::class,
    ];
}

有额外的转换将解密值转换为特定数据类型。如果没有您需要的类型,只需提交一个包含足够测试的 PR 即可。

自定义 RSA 密钥存储

如果您想以其他方式存储您的 RSA 密钥,例如使用 Hashicorp Vault。从 1.4 版本开始,您可以更改配置选项 handler 到使用 RsaKeyHandler 合约的特定类。默认情况下,此包使用存储处理器,将生成的密钥对保存到 storage/ 并在加密或解密过程中检索密钥的内容。这应该被考虑,因为它可能会增加您的应用的延迟。

    /**
     * This class can be overridden to define how the RSA keys are stored, checked for
     * existence and returned for Encryption and Decryption. This allows for keys to
     * be held in secure Vaults or through another provider.
     */
    'handler' => \RichardStyles\EloquentEncryption\FileSystem\RsaKeyStorageHandler::class,

查询构建器

将加密数据存储在数据库中的一个重要缺点是,您无法使用数据库提供程序对列进行查询。如果您需要这样做,请了解额外的开销,因为所有行都需要使用 游标延迟集合方法 在集合中处理。

测试

composer test

变更日志

请参阅 CHANGELOG 了解最近的变化信息。

贡献

请参阅 CONTRIBUTING 了解详细信息。

支持

如果您对此包有任何一般问题,请随时在 Twitter 上联系我。

如果您认为您已经发现了一个问题,请使用 GitHub 问题跟踪器 进行报告,或者更好的是,fork 存储库并提交一个带有失败测试的 pull request。

如果您正在使用此包,我很乐意听到您的想法。谢谢!

安全

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

致谢

许可协议

MIT 许可协议 (MIT)。有关更多信息,请参阅 许可文件

Laravel 包模板

此包是使用 Laravel 包模板 生成的。