使用AES_ENCRYPT在Eloquent模型中加密

时间:2015-07-21 14:49:32

标签: mysql encryption laravel-5 aes

Laravel有一个内置的Crypt类,允许加密。密钥与应用程序相关联,可以使用以下内容按照请求进行更改:

$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密钥保存数据。这设置为通过Memcached类检索,但是现在我使用保存到应用程序环境的已定义键。已定义的密钥在MySQL AES_DECRYPT()中用于解密保存的数据。我们正在尝试保持向后兼容性,因此我需要能够执行类似MySQL 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

1 个答案:

答案 0 :(得分:0)

我没有找到一种成功的方式来按照我要求的方式做到这一点。如果其他用户发布了我可以接受的答案,但这是我的解决方法。

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

此时你将拥有一个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成功显示已保存的文本/加密文本。我不需要那种能力,所以这并不重要。