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



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

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

,然后在每次web应用调用每个控制器、模型和视图中的数据库时手动更改,比如更改:

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

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

,然后每次我检索数据库值(这是很多)做:

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

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

为了避免每次调用数据库时重复使用encrypt()decrypt()方法,您可以使用Eloquents Accessors &调整器。

定义访问器

定义一个访问器,在你的模型上创建一个getFooAttribute方法其中Foo是希望访问的列的"驼峰"大小写名称。在本例中,我们将为first_name定义一个访问器属性。访问器将自动被Eloquent调用试图检索first_name:

的值
<?php
namespace App;
use IlluminateDatabaseEloquentModel;
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是希望访问的列的"驼峰"大小写名称。因此,让我们再次为first_name属性定义一个mutator。这当我们尝试设置值时,Mutator将被自动调用模型上的first_name属性的:

<?php
namespace App;
use IlluminateDatabaseEloquentModel;
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);
    }
}

您可以查看CryptDB。

它可以对数据库进行加密,同时允许您安全地对加密的数据执行查询。

最新更新