【问题标题】:Laravel Eloquent - Encrypting/Decrypt Data on callLaravel Eloquent - 随叫随到的加密/解密数据
【发布时间】:2014-09-01 11:32:33
【问题描述】:

我可以使用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 方式”会更好。

【问题讨论】:

    标签: encryption laravel laravel-4 eloquent


    【解决方案1】:

    加密一切真的没有意义。例如,您永远不想加密主密钥;这甚至没有意义。同样,您可能不想加密日期字段;您将无法对它们执行任何类型的 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 的访问器功能,您将不得不更多地使用它。

    【讨论】:

    • 这不起作用。例如,当我使用User::find(1) 时,在getAttribute() 中调用的唯一$keyidpivot
    • 我愿意!我以return Response::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 是一个数组而不是一个函数。
    • 如果我使用 Query Builder 然后 Eloquent 是否还有其他解决方法?
    【解决方案2】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2020-03-20
    • 1970-01-01
    • 2014-11-30
    • 2015-02-20
    • 2017-05-06
    • 1970-01-01
    相关资源
    最近更新 更多