尝试在整个数据库中实现加密

时间:2015-08-19 04:20:36

标签: php mysql laravel laravel-5 laravel-5.1

我有一个相当大的网络应用程序,它目前没有加密它存储的任何数据(密码和一些令牌除外)在mysql数据库中。在数据库中存储和检索的项目很多。我想知道是否有某种方法可以自动加密存储到数据库的所有内容,然后在从数据库中检索到任何内容时自动解密。我现在最好的选择是把它放在我的routes.php文件中:

View::composer('Crypt', function($view){
    $view->with('Crypt', Crypt::class);
});

然后手动更改Web应用程序每次在每个Controller,Model和View中调用数据库时,如更改:

$user->email = Input::get('email');

$user->email = Crypt::encode(Input::get('email));

然后每次我检索数据库值(这很多)时都会这样做:

{{Crypt::decode($user->email)}}

我觉得必须有一种更简单的方法来做到这一点,而不是手动1000次,但我不确定如何。

2 个答案:

答案 0 :(得分:2)

为避免每次调用数据库时都必须重复使用encrypt()decrypt()方法,您可以改为使用Eloquents Accessors & Mutators

定义访问者

  

要定义访问者,请在模型上创建getFooAttribute方法   Foo是"骆驼"您希望访问的列的名称。   在此示例中,我们将为first_name定义一个访问者   属性。当Eloquent时,访问者将自动调用   试图检索first_name的值:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Decrypt the user's first name.
     *
     * @param  string  $value
     * @return string
     */
    public function getFirstNameAttribute($value)
    {
        return Crypt::decode($value);
    }
}

定义一个Mutator

  

要定义mutator,请在模型上定义setFooAttribute方法   Foo是&#34;骆驼&#34;您希望访问的列的名称。   因此,再次,让我们为first_name属性定义一个mutator。这个   当我们尝试设置值时,将自动调用mutator   模型的first_name属性:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Encrypt the user's first name.
     *
     * @param  string  $value
     * @return string
     */
    public function setFirstNameAttribute($value)
    {
        $this->attributes['first_name'] = Crypt::encode($value);
    }
}

答案 1 :(得分:0)

您可以查看CryptDB

它执行数据库加密,同时允许您仍然安全地对加密数据执行查询。

虽然您需要自己添加对laravel的支持。