laravel 是否有一种方法可以自动对表中的某些列应用解密和加密?

6vl6ewon  于 2023-02-17  发布在  其他
关注(0)|答案(2)|浏览(132)

这就是我想搞清楚的情况。
我有一个名为users的表,它包含以下列,

id
user_name
email      --encrypted
phone      --encrypted
password   --encrypted
created_at
updated_at

我想要实现的是,假设我运行DQL命令SELECT,它应该自动解密这些列中的数据,如下所示

SELECT email FROM users; // this should give the decrypted email value
SELECT * FROM users; // this should give the decrypted email, phone and password value

我想要实现的是,假设我运行了DML命令insert,update,它会自动加密数据,然后在如下列中插入或更新

INSERT INTO users (user_name,email,phone,password) VALUES ('test','test@test.com','1234123412','password'); // this should encrypt email, password, phone before inserting automatically.

我只能从服务器端脚本执行此操作,但问题是应用程序已经创建,更改列名的整个代码将是一项非常耗时的任务。
任何帮助都很感激。

wyyhbhjk

wyyhbhjk1#

你最好的选择是eloquent mutators/accessors Laravel和默认的Laravel加密/解密助手。将自动加密时保存和返回您的列未加密。下面的代码为电子邮件字段例如将自动加密和解密电子邮件列。最大的缺点是你不能搜索任何加密列。希望这对你有帮助

public function setEmailAttribute($value)
{

    $this->attributes['email'] = encrypt($value);
}

public function getEmailAttribute($value)
{
    if ($value !== null) {
        return decrypt($value);
    }
    return null;
}
w41d8nur

w41d8nur2#

MySQL 5.7和更高版本支持一些加密表空间的选项。下面是一篇介绍这些选项的好文章:https://dev.mysql.com/blog-archive/controlling-table-encryption-in-mysql-8-0/
但是没有自动的方法来加密和解密单个列,最接近的方法是需要编写触发器在INSERT & UPDATE时加密,并编写VIEW在读取数据时解密。
除此之外,您还需要着手重构客户机代码(我就是这么做的)。

相关问题