muffin / obfuscate
CakePHP 支持对 ID 混淆
Requires
- cakephp/orm: ^5.0.0
Requires (Dev)
- cakephp/cakephp: ^5.0.0
- cakephp/cakephp-codesniffer: ^5.0
- hashids/hashids: ^1.0.5
- jenssegers/optimus: ^1.1.1
- phpunit/phpunit: ^10.1.0
- tuupola/base62: ^2.1
Suggests
- hashids/hashids: Generate hashids like YouTube or Bitly from numbers to obfuscate your database primary ids, or navigate to the right shard
- jenssegers/optimus: Id obfuscation based on Knuth's multiplicative hashing method
- tuupola/base62: Base62 encoder and decoder for arbitrary data
This package is auto-updated.
Last update: 2024-08-27 05:15:44 UTC
README
使用 HashIds、Optimus、Base62 以及/或自定义混淆策略对 CakePHP 进行主键混淆。
安装
使用 Composer 安装此插件
composer require muffin/obfuscate
通过以下控制台命令加载插件
bin/cake plugin load Muffin/Obfuscate
或者手动将以下行添加到 src/Application.php
$this->addPlugin('Muffin/Obfuscate');
最后,根据您要使用的策略类安装所需的混淆库,如下所述。
内置混淆策略
如果您想使用 HashIdStrategy
- 对主键进行混淆,生成短、唯一、非顺序的 ID
- 将记录 ID 如 347 表示为字符串如 "yr8"
composer require hashids/hashids
如果您想使用 OptimusStrategy
- 对主键进行混淆,基于 Knuth 整数哈希的整数
- 将记录 ID 如 347 表示为整数如 372555994
composer require jenssegers/optimus
如果您想使用 Base62Strategy
- 使用 base62 字符串和整数混淆主键
- 将记录 ID 如 347 表示为字符串如 "vk"
composer require tuupola/base62
您还可以通过实现 StrategyInterface
创建自己的策略类。
用法
1. 附加行为
通过将 Obfuscate 行为附加到您的表并指定要使用的策略来准备混淆,如下例所示。
use Muffin\Obfuscate\Model\Behavior\Strategy\HashIdStrategy; $this->addBehavior('Muffin/Obfuscate.Obfuscate', [ // Strategy constructor parameter: // $salt - Random alpha numeric string. You can also set "Obfuscate.salt" // $minLength (optional) - The minimum hash length. Default: 0 // $alphabet (optional) - Custom alphabet to generate hash from. Default: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890' // config instead of passing salt to construction. // DO NOT USE same salt as set for "Security.salt" config. 'strategy' => new HashIdStrategy('5SX0TEjkR1mLOw8Gvq2VyJxIFhgCAYidrclDWaM3so9bfzZpuUenKtP74QNH6B', 10, 'abcdefghijklmnopqrstuvwxyz') ]);
use Muffin\Obfuscate\Model\Behavior\Strategy\OptimusStrategy; $this->addBehavior('Muffin/Obfuscate.Obfuscate', [ // Strategy constructor parameters: // $prime - Large prime number lower than 2147483647 // $inverse - The inverse prime so that (PRIME * INVERSE) & MAXID == 1 // $random - A large random integer lower than 2147483647 // You can use vendor/bin/optimus spark to generate these set of numbers. 'strategy' => new OptimusStrategy(2123809381, 1885413229, 146808189) ]);
use Muffin\Obfuscate\Model\Behavior\Strategy\Base62Strategy; $this->addBehavior('Muffin/Obfuscate.Obfuscate', [ // Strategy constructor parameters: // $set - Random alpha-numeric set where each character must only be used exactly once 'strategy' => new Base62Strategy('5SX0TEjkR1mLOw8Gvq2VyJxIFhgCAYidrclDWaM3so9bfzZpuUenKtP74QNH6B') ]);
请注意,附加行为是绝对无侵入的,直到您使用自定义查找器之一之前,它将不会做任何事情。
2. 使用自定义查找器
此插件附带以下两个自定义查找器,负责实际的混淆(伪装)和解密(揭示)过程
findObfuscated
:用于使用混淆(伪装)的主键查找记录findObfuscate
:用于混淆(伪装)查找结果集中的所有主键
findObfuscated
如果您想使用混淆 id 查找记录,请使用此查找器。插件将揭示(揭示)混淆 id,并使用“常规”主键执行查找,如它在您的数据库中使用的那样。
CakePHP 示例
public function view($id) { $article = $this->Articles->find('obfuscated') ->where(['id' => $id]) // For e.g. if value for $id is 'S' it will search for actual id 1 ->first(); }
Crud 插件示例
public function view($id) { $this->Crud->on('beforeFind', function (EventInterface $event) { $event->subject()->query->find('obfuscated'); }); }
findObfuscate
如果您想让插件混淆查找结果集中找到的所有“常规”主键,请使用此查找器。
CakePHP 示例
public function index() { $articles = $this->Articles->find('obfuscate'); }
Crud 插件示例
public function index() { $this->Crud->on('beforePaginate', function (EventInterface $event) { $event->subject()->query->find('obfuscate'); }); }
方法
附加行为还使表上有以下两个方法可用
obfuscate(string $str)
elucidate(string $str)
技巧
身份验证
一个相当常见的用例是将混淆应用于用户 id。为了确保 Authentication 插件正确处理混淆 id,请在您的 标识符解析器 配置中使用 obfuscated
查找器。
补丁和功能
- 分支
- 修改、修复
- 测试 - 这很重要,所以它不会意外损坏
- 提交 - 不要修改许可证、todo、版本等。(如果您更改了它们,请将它们放入自己的提交中,这样我在拉取时可以忽略它们)
- 拉取请求 - 主题分支的加分项
为了确保您的 PR 被考虑纳入上游,您必须遵循 CakePHP 编码规范。
错误和反馈
http://github.com/usemuffin/obfuscate/issues
许可证
版权所有(c)2015-至今,Use Muffin,并许可于MIT 许可证下。