vkn999 / eloquentencryption
允许使用4096位RSA私钥对Eloquent属性进行加密和解密。
Requires
- php: ^8.0|^8.1
- illuminate/database: ^9.0
- illuminate/support: ^9.0
- phpseclib/phpseclib: ^2.0.37
Requires (Dev)
- orchestra/testbench: ^7.4
- phpunit/phpunit: ^9.5.20
This package is not auto-updated.
Last update: 2024-09-28 21:44:22 UTC
README
此包在处理敏感数据时提供了额外的安全层。允许数据库中Eloquent模型的键字段在静止状态下进行加密。
简介
这个开源包满足了加密数据库中选定模型数据的需求,同时允许您旋转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 包模板 生成的。