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
?
答案 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
成功显示已保存的文本/加密文本。我不需要那种能力,所以这并不重要。