Encryption Laravel Eloquent-加密/解密待命数据

Encryption Laravel Eloquent-加密/解密待命数据,encryption,laravel,laravel-4,eloquent,Encryption,Laravel,Laravel 4,Eloquent,我可以使用Crypt加密/解密我的数据。我想加密数据库中的一些信息(例如姓名、电子邮件、电话号码等) 假设我希望所有内容都被加密,我希望自己能够在后台完成这项工作,我可以通过覆盖create和save函数来执行: // For instance, the save() function could become public function save(array $options = array()) { foreach ($this->attributes as $key =&

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

假设我希望所有内容都被加密,我希望自己能够在后台完成这项工作,我可以通过覆盖
create
save
函数来执行:

// 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)
也可以工作)

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


首先将我的所有结果传递给大家,然后开始使用它们,但是如果Laravel能提供这个,或者有一种“Laravel方法”来实现这一点,那就更好了。

对所有内容进行加密真的没有意义。例如,您永远不想加密主键;这根本没有道理。同样,您可能不想加密日期字段;您将无法对它们执行任何类型的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的访问器功能,您必须更多地使用它。

值得一提的是Laravel 4的库。这是一个更复杂的解决方案,其工作原理与此相同。如果您使用的是Laravel 5,请改用这个:。

这不起作用。例如,当我使用
User::find(1)
时,在
getAttribute()
中调用的唯一
$key
id
pivot
我所做的!我使用
returnresponse::json(User::find($id))
作为示例,并且从不调用
getAttribute
。如果我做了
User::find($id)->name
,那么肯定会调用它。但是我从API返回这个,所以我需要JSON来工作?即使是
User::find($id)->toJson()
也不能称之为美丽!非常感谢。一个小注释,我认为您需要键入
Crypt::decrypt($this->attributes[$key])
与Crypt::decrypt($this->attributes($key))相反因为
$this->attributes
是一个数组而不是一个函数。如果我使用QueryBuilder then Eloquent,还有其他解决方法吗?看起来也不错。
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;
    }

}