chuyubo/field_encryption

数据库字段加密解密

v6.0.0 2023-02-10 02:31 UTC

This package is not auto-updated.

Last update: 2024-09-26 05:59:22 UTC


README

原理:

1. 替换 db.factory ,将对应的 factory 指向自定义 FieldEncryptionConnectionFactory,将对应的 mysqlConnection 指向自定义 FieldEncryptionMysqlConnection,最终将 Builder 替换成自定义 FieldBuilder

2. 改写 FieldBuilder 中的 get、insert、update 等方法,将需要加密的字段进行加密,读取时将加密字段进行解密

注意:

并非所有写法都适用,例如 Raw、whereRaw 等原生写法,也不支持 sql 函数对该字段进行处理,当相关业务涉及到上述写法时,建议修改写法或加字段加密成加密字段后再添加

加密
//$rule => 配置保留前置位数和加密
$rule = ['pre_len' => 0, 'encryption_field_len' => 20000];
/** @var \FieldEncryption\Utils\EncryptionUtils $encryption */
$encryption = app(\FieldEncryption\Utils\EncryptionUtils::class);
$value = $encryption->encryptionAes($value, $rule['pre_len'], $rule['encryption_field_len']);
解密
/** @var \FieldEncryption\Utils\DecryptUtils $decrypt */
$decrypt = app(\FieldEncryption\Utils\DecryptUtils::class);
$value = $decrypt->decryptAes($value);

使用方法:

1. 在 Laravel 中 app/config/app.php 的 providers 添加

 \FieldEncryption\Providers\DatabaseServiceCustomProvider::class,
 \FieldEncryption\Providers\FieldEncryptionProvider::class,

注意要放到 Illuminate\Database\DatabaseServiceProvider::class 以下的位置,相当于覆盖

2. 将 vendor/chuyubo/field_encryption/config/field_encryption.php 复制到 app/config/ 文件夹下

aes_key 加密密钥,保证不进行修改
aes_pre 加密后的字段前缀标识,不要为空
aes_tail 加密后的字段后缀标识,不要为空
table_tmp 临时表后缀,要复杂,不要与原表名后缀一样,不要为空
table_tmp_switch 临时表开关,true|false,执行同步脚本时需要打开,其他情况下关闭
field 表字段配置 二维数组,内容如下
[
    [
        'table' => '', //table 表名称
        'column' => '', //加密列
        'rule' => '', //加密规则,与下面rules 相对应
    ]
]
rules 加密规则:
[
    //键值对应field中的rule
    'default' => [
        'pre_len' => 0, //加密字段前置保留位数,适配一些模糊查询
        'tail_len' => 0, //加密字段后置保留位数,目前并不管用
        'encryption_field_len' => 20000, //加密位数,目前根据前置位数+加密位数来决定加密成什么样子
    ],
]

3. 将数据同步成加密数据的加密脚本

php artisan sys:filed-encryption

可以根据自己的需求改写,脚本所在位置
vendor/chuyubo/field_encryption/src/Command/SysCommand.php
原理:生成临时表进行插入加密后的数据然后关联替换

4. 最终加密后效果:

field_NResPuJT+vjlfgspUqNINah5PsJwwJ2yA6shz9WsSSS=_encryption0,0
解析:'field _' 为前置加密标识,'_encryption' 为后置加密标识,0,0 前置保留位数 0,后置保留位数 0