leoboy / desensitization
基于安全策略的数据脱敏工具,具有各种转换规则。
Requires
- php: >=8.1
- illuminate/hashing: ^8.0|^9.0|^10.0|^11.0
- illuminate/support: ^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- laravel/pint: ^1.0
- orchestra/testbench: ^7.0|^8.0|^9.2
- phpstan/phpstan: ^1.11
- phpunit/phpunit: ^10.0|^11.2
This package is auto-updated.
Last update: 2024-09-30 01:27:14 UTC
README
一个强大的PHP数据脱敏工具,内置丰富的脱敏计算规则:掩码、加密、截断、替换等。它还支持基于安全策略的动态授权脱敏。
功能
- 丰富的内置脱敏计算规则:
mask
、hash
、cut
、replace
等。 - 通过自定义
Guard
、SecurityPolicy
和Rule
支持复杂的动态授权脱敏。 - 支持在多维数组的不同级别匹配和脱敏键值对。
- 支持脱敏单个输入值。
- 支持集成到Laravel框架。
环境
- PHP >= 8.1
- Composer
快速入门
安装
composer require "leoboy/desensitization"
用法
- 初始化
use Leoboy\Desensitization\Desensitizer; // Instantiate a regular desensitizer $localDesensitizer = new Desensitizer(); // Create or get a global singleton object $globalDesensitizer = Desensitizer::global(); // Make the local object a global desensitizer object $localDesensitizer->globalize();
- 应用脱敏规则
use Leoboy\Desensitization\Desensitizer; use Leoboy\Desensitization\Rules\Mask; use App\Rules\CustomRule; $data = [ 'foo' => 'tom', 'bar' => [ 'baz' => 123, 'jax' => [ 'jerry', 'henry' ] ] ]; $desensitizer = new Desensitizer(); $desensitizer->invoke('abc123', fn ($str) => strrev($str)); // 321cba $desensitizer->invoke('123456', Mask::create()->padding(2)->use(*)->repeat(3)); // 12***56 $desensitizer->invoke('123456', 'mask|use:x|repeat:3|padding:1'); // 1xxx6 $desensitizer = new Desensitizer(); // Multi-dimensional array $desensitizer->desensitize($data, [ 'foo' => Mask::create()->padding(2)->use(*)->repeat(3), 'bar' => new CustomRule(), 'baz.*' => fn ($str) => strrev($str), 'qux.*.fred' => 'mask|use:x|repeat:3|padding:4' ]);
Laravel集成
对于Laravel框架,它支持自动包发现和加载,无需手动安装。
如果您想更改配置,可以使用以下命令发布配置文件 desensitization.php
:
php artisan vendor:publish --provider="Leoboy\Desensitization\Laravel\DesensitizationServiceProvider"
配置文件内容
wildcard_char
,它定义了在多维度数组搜索中使用的通配符,默认为 "*"。key_dot
,它定义了在多维度数组搜索中使用的关键字分隔符,默认为 "."。skip_transformation_exception
,告诉脱敏器是否跳过规则抛出的异常,默认为布尔值false
。
脱敏器对象自动绑定到Laravel容器中(除非通过 global
方法访问,它返回一个局部脱敏器对象)。您可以通过提供的Facade快速访问脱敏器对象
use Leoboy\Desensitization\Laravel\Facades\Desensitization; Desensitization::global()->via(fn ($str) => strrev($str))->invoke('abc123'); // 321cba // return a local desensitizer object unless call global method Desensitization::via(Mask::create())->desensitize($data, [ 'foo' => new CustomRule(), 'bar' => fn ($str) => strrev($str), 'jax' => 'mask|use:x|repeat:3|padding:4' ]);
基于动态分层策略执行脱敏
在实际应用场景中,通常需要对不同级别的用户执行不同的脱敏过程,例如:管理员可以查看所有数据,而普通用户只能看到部分数据。为了解决这个问题,这个库提供了三个接口定义:“GuardContract”、“SecurityPolicyContract”和“RuleContract”。
$desensitizer = new Desensitizer(); $desensitizer->via(new User())->desensitize($data, [ 'foo' => 'email', 'bar.*' => 'mask|use:x|repeat:3|padding:4', 'baz.jax' => Replace::create()->use('-'), 'jaz' => fn ($input) => strrev($input), 'frud.*' ])
- 在
transform
方法中定义的字段属性类型通常应该是字符串。如果无法将string
类型解析为RuleContract
或定义了callable|RuleContract
类型,它将首先执行,而不通过在via
中指定的守卫。 via
方法用于指定当前脱敏过程要传递的守卫,也可以传递全局使用的规则或回调。其参数类型为:string|GuardContract|RuleContract|SecurityPolicyContract|callable
。- 如果没有调用
via
方法,则默认使用\Leoboy\Desensitization\Guards\NoneGuard
守卫,守卫不对输入值进行任何转换。
RuleContract
自定义规则类需要实现接口:\Leoboy\Desensitization\Contracts\RuleContract
。规则类定义了如何将输入值转换为输出值。
class CustomRule implements RuleContract { public function transform($value) { return md5($value); } }
目前,该包包含以下内置规则
Leoboy\Desensitization\Rules\None
:无规则,直接返回输入值。Leoboy\Desensitization\Rules\Mask
:掩码规则,允许您指定掩码字符、重复次数和填充长度等:Mask::create()->use('*')->repeat(3)->padding(2)
Leoboy\Desensitization\Rules\Replace
:替换规则,允许您指定要替换的字符:Replace::create()->use('replacement_chars')
Leoboy\Desensitization\Rules\Cut
:截断规则,允许您指定截断长度:Cut::create()->start(1)->length(3)
Leoboy\Desensitization\Rules\Invoke
:执行指定的callable
定义:Invoke::create(fn ($str) => strrev($str))
Leoboy\Desensitization\Rules\Hash
:加密规则,允许您指定哈希驱动程序和哈希参数。构造函数或use
方法中传入的哈希驱动程序应实现以下接口:Illuminate\Contracts\Hashing\Hasher
。默认加密算法是 Bcrypt 驱动程序:Hash::create()->use(new Illuminate\Hashing\BcryptHasher())->options(['cost' => 10])
Leoboy\Desensitization\Rules\Mix
,执行多个规则,规则列表通过构造函数传入:Mix::create([Replace::create('*'), Mask::create()])
规则也可以使用简称
mask|use:x|repeat:3|padding:4
其效果与
Mask::create()->use('x')->repeat(3)->padding(4)
目前可用的简称
[ 'cut' => \Leoboy\Desensitization\Rules\Cut::class, 'hash' => \Leoboy\Desensitization\Rules\Hash::class, 'mask' => \Leoboy\Desensitization\Rules\Mask::class, 'none' => \Leoboy\Desensitization\Rules\None::class, 'replace' => \Leoboy\Desensitization\Rules\Replace::class, ]
如果您想添加一个新的自定义规则及其简称,可以使用
$desensitizer->register(\App\Rules\CustomRule::class, 'custom-rule');
如果您想覆盖内置规则,可以使用(可能会引起一些不可预测的问题)
$desensitizer->register(\App\Rules\CustomMaskRule::class, 'mask', true);
GuardContract
保护器用于获取安全策略。在常见场景中,保护器可以是一个用户模型或自定义类,但两者都需要实现以下接口:\Leoboy\Desensitization\Contracts\GuardContract
例如
class User implements Guard { public function getSecurityPolicy(): SecurityPolicyContract { return match (true) { $this->isAdministrator() => new CustomHighLevelSecurityPolicy(), default => new UnlimitedSecurityPolicy() } } }
内置保护器包括
-
Leoboy\Desensitization\Guards\PolicyFixedGuard
:此保护器返回一个固定的安全策略对象。 -
Leoboy\Desensitization\Guards\RuleFixedGuard
:此保护器返回一个绑定到安全策略的固定规则对象。
SecurityPolicyContract
安全策略类需要实现以下接口:Leoboy\Desensitization\Contracts\SecurityPolicyContract
。安全策略根据用户输入属性对象确定如何对用户输入属性字段进行脱敏。可以针对不同属性定义不同的规则或闭包。
class CustomHighLevelSecurityPolicy implements SecurityPolicyContract { public function decide(AttributeContract $attribute): RuleContract|callable { return match ($attribute->getType()) { 'email' => 'replace:*', 'username' => new CustomRule(), 'password' => function ($username) { return md5($username . mt_rand(100, 999)); }, default => Mask::create()->use('*')->repeat(3)->padding(2) }; } }
内置安全策略包括
Leoboy\Desensitization\SecurityPolicy\UnlimitedSecurityPolicy
:此安全策略始终返回:Leoboy\Desensitization\Rule\None
规则对象,它不修改数据并返回输入字段值。Leoboy\Desensitization\SecurityPolicy\RuleFixedSecurityPolicy
:此安全策略返回一个固定的规则对象。
许可证
脱敏是开源软件,根据 MIT 许可证 许可。
与我联系
如果您有任何问题,可以提出问题。
使用这个强大的工具,您可以根据具体需求和安全策略灵活地定义和应用脱敏规则。
❤️ 欢迎使用!