mysql - 使用 AES_ENCRYPT 在 Eloquent 模型中加密

标签 mysql encryption laravel-5 aes

Laravel 有一个允许加密的内置 Crypt 类。 key 与应用相关联,可以根据请求使用类似以下内容进行更改:

$key = env('DEV_CACHE_KEY', 'DEV_CHANGE');
Crypt::setKey($key); // sets to new key
$action->descr = Crypt::encrypt($request->descr);
Crypt::setKey(Config::get('app.key')); // resets key to app
$action->save()

我们使用保存在特定服务器上的 Memcached key 来保存我们的数据。这设置为通过 Memcached 类检索,但现在我使用保存到应用程序环境的定义键。定义的 key 在 MySQLs AES_DECRYPT() 中用于解密保存的数据。我们正在努力保持向后兼容性,因此我需要能够执行类似 MySQLs AES_ENCRYPT() 的操作。

上面的代码不起作用,因为当我用下面的代码解密时,它返回空。

$ynak = env('DEV_CACHE_KEY', 'DEV_CHANGE');;

return DB::connection('action_table')
    ->table('action AS a')
    ->select('a.*', DB::raw('AES_DECRYPT(`descr`, "'.$ynak.'") as `descr`'), DB::raw('(status LIKE "%completed%" OR status LIKE "%closed%") as isClosed'));

表格的设置方式有点不好,因为我继承了它,但我不允许进行更改。

有没有办法使用 Crypt::encrypt 来等同于 MySQL AES_ENCRYPT

最佳答案

我没有找到按照我要求的方式成功执行此操作的方法。如果另一个用户发布了我可以接受的答案,但这是我的解决方法。

以某种方式创建模型的新实例。所有方式都可以接受。它应该只创建模型并保存到数据库中。

到那时你就会有一个 id(你应该有一个自动增量 id 来引用)。

$action = new Action();
...
$action->save();

$id = $action->id;
$key = env('DEV_CACHE_KEY', 'DEV_CHANGE');
DB::connection('action_table')->table('action')->where('id', '=', $id)->update([
    'descr' => DB::raw('AES_ENCRYPT("'.$request->descr.'", "'.$key.'")')
]);

这将根据需要进行 AES 加密并创建新操作。唯一的问题是您无法使用$action->descr 来成功显示保存的文本/加密文本。我不需要那种能力,所以这无关紧要。

关于mysql - 使用 AES_ENCRYPT 在 Eloquent 模型中加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31542452/

相关文章:

php - 日期的 between 子句以 h :i A 的格式存储

java - 在 Java 中加密/解密 "AES/ECB/PKCS5Padding"

php - Laravel Eloquent paginate 如何查询分页参数?

encryption - 检索 channel 历史记录时为什么会收到 “Decryption Error”?

android - 加密数据库(sqlcipher,cacheword)的备份和恢复?

javascript - 动态表单编辑页面 : Laravel 5. 2

php - Laravel (5.2) Excel 下载 xls 错误 ERR_INVALID_RESPONSE (chrome)

mysql - 在同一台机器上安装多个 MySQL 集群 - CentOS 7

mysql - 如何按自定义字段对 MySQL ResultSet 进行排序?

MySQL触发器语法错误