我正在尝试将以下用于加密数据库中某些列的 trait 迁移到本机 Laravel 9 加密转换。
我遇到的问题是,虽然它对于新值非常有效,但对于现有值我得到了一些额外的值。
因此,解密后不是获得干净的值:
Harry Potter
我得到以下信息:
s:23:"Harry Potter";
我不确定最好的方法是什么?我正在考虑循环遍历所有值并应用一些正则表达式,但这太疯狂了,我现在有很多列和值。
假设您还没有使用两种不同方法的混合加密值:
一种解决方案可能是注释模型中的可加密属性(自定义特征之一),然后编写代码来重新保存所有具有加密值的模型(这应该保存解密的列)。
此时,您需要从项目中删除自定义特征,并在模型中添加 Laravel 9 加密转换,并编写代码来重新保存所有内容。
您应该运行迁移来加密这些值。例如:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Crypt;
class EncryptUserEmailInUsersTable extends Migration
{
public function up()
{
DB::table('users')->where('user_email', '!=', null)
->select(['id','user_email'])
->get()
->each(function($z) {
DB::table('users')->where('id', $z->id)
->update([
'user_email' => Crypt::encryptString($z->user_email)
]);
});
}
}