在laravel中加密/解密DB字段

时间:2018-02-14 11:19:40

标签: php laravel encryption laravel-5 eloquent

我正在通过访问器和更改器加密/解密Laravel中的DB字段值,这在正常的口才交易中工作正常。

class Person extends Model
{
    use Notifiable;
    protected $table = 'person';

    public function getFirstNameAttribute($value)
    {
        return Crypt::decryptString($value);
    }
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $guarded = array();

    protected function user()
    {
        return $this->belongsTo('App\Models\User', 'useraccount_id', 'id');
    }
}

但加密和解密在以下条件下无法正常工作

  1. 雄辩的关系
  2. 数据库原始查询
  3. 工作

    $person = Person::find($person_id);
    $person->firstName;
    

    不工作

    $user = User::find($user_id);
    $user->person->firstName;
    

3 个答案:

答案 0 :(得分:3)

您可能会在数据库级别进行加密,就好像某人可以访问数据库一样,您不希望他们能够以纯文本格式读取人们的医疗数据。

您可以创建一个特征,分别在保存和检索时对数据进行加密和解密:

namespace App\Traits;

use Illuminate\Support\Facades\Crypt;
trait Encryptable
{
    /**
     * If the attribute is in the encryptable array
     * then decrypt it.
     *
     * @param  $key
     *
     * @return $value
     */
    public function getAttribute($key)
    {
        $value = parent::getAttribute($key);
        if (in_array($key, $this->encryptable) && $value !== '') {
            $value = decrypt($value);
        }
        return $value;
    }
    /**
     * If the attribute is in the encryptable array
     * then encrypt it.
     *
     * @param $key
     * @param $value
     */
    public function setAttribute($key, $value)
    {
        if (in_array($key, $this->encryptable)) {
            $value = encrypt($value);
        }
        return parent::setAttribute($key, $value);
    }
    /**
     * When need to make sure that we iterate through
     * all the keys.
     *
     * @return array
     */
    public function attributesToArray()
    {
        $attributes = parent::attributesToArray();
        foreach ($this->encryptable as $key) {
            if (isset($attributes[$key])) {
                $attributes[$key] = decrypt($attributes[$key]);
            }
        }
        return $attributes;
    }
}

然后,您可以仅将特征应用于模型,并定义一个名为$ encryptable的属性,该属性是应加密其数据的列的数组:

class YourModelextends Model
{
    use Encryptable;

    protected $encryptable = [
        'code',
        'keys',
        'allergies'
    ];
}

答案 1 :(得分:1)

基于Iman的回答,我更改了特征,使其与Laravel自身的演员表数组配合使用。

i1 <- rle(df$TC_17)

#Run Length Encoding
#  lengths: int [1:5] 3 1 2 2 2
#  values : int [1:5] 1 -1 1 -1 1

i1$values[which(i1$lengths == 1 & i1$values == -1)] <- 1

#Run Length Encoding
#  lengths: int [1:5] 3 1 2 2 2
#  values : num [1:5] 1 1 1 -1 1

i2 <- which(rep(i1$values, i1$lengths) == 1)
#[1]  1  2  3  4  5  6  9 10


split(i2, cumsum(c(TRUE, diff(i2) != 1)))
#$`1`
#[1] 1 2 3 4 5 6

#$`2`
#[1]  9 10

答案 2 :(得分:0)

您可以使用laravel的 Crypt 门面来做到这一点。 请按照此示例。

use Illuminate\Support\Facades\Crypt;

$encrypted = Crypt::encryptString('Hello world.');

$decrypted = Crypt::decryptString($encrypted);