从加密特征迁移到 Laravel 模型 $cast

问题描述 投票:0回答:3

我正在尝试将以下用于加密数据库中某些列的 trait 迁移到本机 Laravel 9 加密转换。

我遇到的问题是,虽然它对于新值非常有效,但对于现有值我得到了一些额外的值。

因此,解密后不是获得干净的值:

Harry Potter

我得到以下信息:

s:23:"Harry Potter";

我不确定最好的方法是什么?我正在考虑循环遍历所有值并应用一些正则表达式,但这太疯狂了,我现在有很多列和值。

laravel encryption eloquent casting
3个回答
0
投票

假设您还没有使用两种不同方法的混合加密值:

一种解决方案可能是注释模型中的可加密属性(自定义特征之一),然后编写代码来重新保存所有具有加密值的模型(这应该保存解密的列)。

此时,您需要从项目中删除自定义特征,并在模型中添加 Laravel 9 加密转换,并编写代码来重新保存所有内容。


0
投票

您应该运行迁移来加密这些值。例如:

<?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)
                    ]);
            });
    }
}

0
投票

我猜测当您尝试迁移到本机加密转换时,它使用了

encrypt()
helper 方法。在最新的版本中,使用的方法已经更新为
Crypt::encryptString
。 尝试对它们进行测试,看看您的案例中使用的是哪一个。序列化选项可能不匹配。

PS:这个答案可能会帮助其他正在经历的人 自 2022 年以来,您的问题可能已得到解决。

© www.soinside.com 2019 - 2024. All rights reserved.