Laravel Eloquent - 加密/解密数据

时间:2014-07-10 22:52:29

标签: encryption laravel laravel-4 eloquent

我可以使用Crypt来加密/解密我的数据。我想加密我的数据库中的一些信息(例如姓名,电子邮件,电话号码等等)。

假设我希望加密所有内容,我希望能够在后台自行完成此操作,我可以通过覆盖createsave函数来执行此操作:

// For instance, the save() function could become
public function save(array $options = array())
{
    foreach ($this->attributes as $key => $value)
    {
        if (isset($value)) $this->attributes[$key] = Crypt::encrypt($value);
    }
    return parent::save($options);
}

现在,我希望以相同的方式执行解密,因此当我说User::find($id)时,返回的$user已经被解密。还有其他功能,例如firstOrFail() get() first()以及所有功能。

我也希望在使用关系时扩展此功能(因此User::with('someOtherTable')->find($id)也可以工作)。

这可能吗?如果这是不可能的,我正在考虑创建一个辅助函数decyrpt()

function decrypt($array)
{
    if (!is_array($array)) return Crypt::decrypt($array);

    $result = [];

    foreach($array as $key => $value) $result[$key] = decrypt($value);

    return $result;
}

首先通过我的所有结果,然后开始使用它们,但如果Laravel会提供这个,或者如果有一个" Laravel Way"那么它会更好。这样做。

2 个答案:

答案 0 :(得分:16)

加密所有内容并没有多大意义。例如,您永远不想加密主键;这甚至没有意义。同样,您可能不想加密日期字段;你将无法对它们执行任何类型的SQL查询。

考虑到这一点,你可以尝试这样的事情:

class BaseModel extends Eloquent {

    protected $encrypt = [];

    public function setAttribute($key, $value)
    {
        if (in_array($key, $this->encrypt))
        {
            $value = Crypt::encrypt($value);
        }

        return parent::setAttribute($key, $value);
    }

    public function getAttribute($key)
    {
        if (in_array($key, $this->encrypt))
        {
            return Crypt::decrypt($this->attributes[$key]);
        }

        return parent::getAttribute($key);
    }

    public function attributesToArray()
    {
        $attributes = parent::attributesToArray();

        foreach ($attributes as $key => $value)
        {
            if (in_array($key, $this->encrypt))
            {
                $attributes[$key] = Crypt::decrypt($value);
            }
        }

        return $attributes;
    }

}

然后让所有模型扩展此模型,并将$encrypt属性设置为您希望为该特定模型加密的任何列。


P.S。如果你想使用Eloquent的访问器功能,你将不得不再玩这个。

答案 1 :(得分:1)

值得一提的是Laravel 4的Elocrypt库。这是一个更精细的解决方案,其工作方式相同。如果您使用的是Laravel 5,请使用此代码:Elocrypt 5