Laravel 5中的加密和解密

我一直在寻找关于加密和解密Laravel值的想法(如VIN号码,员工身份证号码,社交 安全号码等)最近在Laravel网站上发现了这一点: https://laravel.com/docs /5.6/encryption </ p>

我的问题是,如何在刀片模板上打印解密值? 我可以看到通过控制器并设置变量然后将其打印到Blade,但我很好奇我将如何将解密值打印到索引? 像这样...... </ p>

  @foreach($ employees as $ employee)
{{$ employee-&gt;解密价值某种方式}}
{{$ employee-&gt ; name}}
@ endforeach
</ code> </ pre>
</ div>

展开原文

原文

I have been looking for ideas on encrypting and decrypting values in Laravel (like VIN Numbers, Employee ID Card Numbers, Social Security Numbers, etc.) and recently found this on the Laravel website: https://laravel.com/docs/5.6/encryption

My question is, how would I print the decrypted values on a blade template? I could see going through the controller and setting a variable and then printing it to a Blade, but I was curious as to how I would also print a decrypted value to an index? Like so...

@foreach($employees as $employee)
{{$employee->decrypted value somehow}}
{{$employee->name}}
@endforeach

dsfsfdsf4544
dsfsfdsf4544 只需在视图中执行{{decrypt($employee->ssn)}}。简单。
2 年多之前 回复

5个回答



您可以使用特征处理加密属性( app / EncryptsAttributes.php </ code>):</ p> \ n

  namespace App; 

trait EncryptsAttributes {

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

\ foreach($ this-&gt; getEncrypts()as $ key){
if(array_key_exists($ key,$ attributes)){
$ attributes [$ key] = decrypt($ attributes [$ key]);

}
}
返回$ attributes;
}

公共函数getAttributeValue($ key){
if(in_array($ key,$ this-&gt; getEncrypts())){
return decrypt($ this-&gt; attributes [$ key]);
}
返回parent :: getAttributeValue($ key);
}

公共函数setAttribute($ key,$ value){
if (in_array($ key,$ this-&gt; getEncrypts())){
$ this-&gt; attributes [$ key] = encrypt($ value);
} else {
paren t :: setAttribute($ key,$ value);
}
返回$ this;
}

受保护函数getEncrypts(){
返回property_exists($ this,'encrypts')? $ this-&gt;加密:[];
}

}
</ code> </ pre>

必要时在模型中使用它:</ p>
\ n

 类员工扩展模型{

使用EncryptsAttributes;

protected $ encrypts = ['cardNumber','ssn'];
\ n}
</ code> </ pre>

然后您可以在不考虑加密的情况下获取和设置属性:</ p>

  $ employee-  &gt; ssn ='123'; 
{{$ employee-&gt; ssn}}
</ code> </ pre>
</ div>

展开原文

原文

You can handle encrypted attributes with a trait (app/EncryptsAttributes.php):

namespace App;

trait EncryptsAttributes {

    public function attributesToArray() {
        $attributes = parent::attributesToArray();
        foreach($this->getEncrypts() as $key) {
            if(array_key_exists($key, $attributes)) {
                $attributes[$key] = decrypt($attributes[$key]);
            }
        }
        return $attributes;
    }

    public function getAttributeValue($key) {
        if(in_array($key, $this->getEncrypts())) {
            return decrypt($this->attributes[$key]);
        }
        return parent::getAttributeValue($key);
    }

    public function setAttribute($key, $value) {
        if(in_array($key, $this->getEncrypts())) {
            $this->attributes[$key] = encrypt($value);
        } else {
            parent::setAttribute($key, $value);
        }
        return $this;
    }

    protected function getEncrypts() {
        return property_exists($this, 'encrypts') ? $this->encrypts : [];
    }

}

Use it in your models when necessary:

class Employee extends Model {

    use EncryptsAttributes;

    protected $encrypts = ['cardNumber', 'ssn'];

}

Then you can get and set the attributes without thinking about the encryption:

$employee->ssn = '123';
{{ $employee->ssn }}

duandi5328
duandi5328 对于$ model-> toArray()和$ model-> toJson(),attributesToArray()是必需的。
大约 2 年之前 回复
douji5746
douji5746 嗨我实现相同,它使用getattribute和setattribute,但没有得到为什么使用attributesToArray
大约 2 年之前 回复



您可以创建自定义函数或一个访问者。 </ p>

假设您的模型是 Employee </ code>,加密列是 ssn </ code>。 您可以这样做:</ p>

 &lt;?php 

namespace App;

use Illuminate \ Database \ Eloquent \ Model;

class Employee extends Model
{
//使用函数
公共函数decryptSsn()
{
返回解密($ this-&gt; attributes ['ssn']);
}

//使用存取函数
public function getDecryptedSsnAttribute()
{
返回解密($ this-&gt; attributes ['ssn']);
}
}
</ code> </ pre>

In 如果您使用函数,您可以这样称呼:</ p>

  $ employee-&gt; decryptSsn(); 
</ code> </ pre>
\ n

如果您使用访问者,您可以这样称呼它:</ p>

  $ employee-&gt; decrypted_ssn; 
</ code> </ pre>

</ div>

展开原文

原文

You could create a custom function or an accessor in your model.

Say your model is Employee and your encrypted column is ssn. You could do that:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Employee extends Model
{
    // With a function
    public function decryptSsn()
    {
        return decrypt($this->attributes['ssn']);
    }

    // With an accessor
    public function getDecryptedSsnAttribute()
    {
        return decrypt($this->attributes['ssn']);
    }
}

In case you go with function, you'd call it like this:

$employee->decryptSsn();

And if you go with an accessor, you would call it like this:

$employee->decrypted_ssn;

dp815292
dp815292 你没有被缓存的解密值是对的。 我认为第一次调用它时会附加到$ attributes数组,并从那里调用它。 经过测试,我错了。 至于功能更易于维护,是有特征或将另一种类型附加到$ casts将更加可维护。 但在许多视图中解密($ m-> ssn)可能会发生,这是更容易维护的第1步。
2 年多之前 回复
doutan1637
doutan1637 因此,如果您计划在同一请求周期内多次打印,则访问者会更好。 - 它怎么样更好? 解密的值不会被缓存。 那有什么区别?
2 年多之前 回复
dougong1031
dougong1031 我不同意为每个加密属性设置单独的功能或访问器是很容易维护的。 我更倾向于继承一个带有属性名称的函数(类或特征),而是处理解密。
2 年多之前 回复
douxie5930
douxie5930 那也行,是的。 我建议使用功能/访问器以便于维护
2 年多之前 回复
dstd2129
dstd2129 当一个简单的{{decrypt($ employee-> ssn)}}在视图中这样做时,这似乎过于复杂了。
2 年多之前 回复



在模型中使用追加</ code>。 更容易在任何地方使用而无需重复使用加密/解密助手</ p>

 类员工扩展模型{
protected $ appends = [
'encrypted_ssn_number',
];
\ n protected $ hidden = ['ssn']; //如果你想隐藏sson的实际值的json

公共函数getEncryptedSsnNumberAttribute()
{
return encrypt($ this-&gt; ssn); // md5($ this-&gt; ssn); // bcrypt($ this-&gt; ssn)
//如果$ this-&gt; ssn无效,请使用$ this-&gt;属性['ssn']
}
}
</ code> < / pre>

在模型中使用</ p>

  {{employee-&gt; encrypted_ssn_number}} 
</ code> </ pre>
</ DIV>

展开原文

原文

use appends in models. easier to use anywhere without repeating using encrypt/decrypt helper

class Employee extends Model {
     protected $appends = [
           'encrypted_ssn_number',
     ];

     protected $hidden = ['ssn']; //if you want to hide from json of actual value of ssn

     public function getEncryptedSsnNumberAttribute()
     {
         return encrypt($this->ssn); // md5($this->ssn);  //bcrypt($this->ssn)
         // if $this->ssn not working, use $this->attribute['ssn']
     }
}

use in model

{{ employee->encrypted_ssn_number }}



你可以通过简单的方法在app / trait中创建自定义特征Encryptable.php </ p>

 <  code> namespace App \ Traits; 
use Illuminate \ Support \ Facades \ Crypt;

trait Encryptable
{

共享函数getAttribute($ key)
{
$ value = parent :: getAttribute($ key);

if(in_array($ key,$ this-&gt; encryptable)){
try {
$ value = Crypt :: decrypt($ value);
} catch(\ Exception $ e){
$ value = null;
}
}
返回$ value;
}
公共函数setAttribute($ key,$ value)
{
parent :: setAttribute($ key,$ value);
$ value = $ this-&gt; attributes [$ key];
if(in_array($ key,$ this-&gt; encryptable)){
$ this-&gt; attributes [$ key] = Crypt :: encrypt($ 值);
}
返回$ this;
}
}
</ code> </ pre>

仅在模型中使用它来加密您想要加密的列。< / p>

 使用App \ Traits \ Encryptable; 
class ABC扩展模型{

use加密;

保护$ encr yptable = ['name','description'];

}
</ code> </ pre>
</ div>

展开原文

原文

you can handle with simple create a custom trait in app/trait Encryptable.php

namespace App\Traits;
use Illuminate\Support\Facades\Crypt;

trait Encryptable
{
public function getAttribute($key)
{
    $value = parent::getAttribute($key);
    if (in_array($key, $this->encryptable)) {
        try {
            $value = Crypt::decrypt($value);
        } catch (\Exception $e) {
            $value = null;
        }
    }
    return $value;
}
public function setAttribute($key, $value)
{
    parent::setAttribute($key, $value);
    $value = $this->attributes[$key];
    if (in_array($key, $this->encryptable)) {
        $this->attributes[$key] = Crypt::encrypt($value);
    }
    return $this;
}
}

Use it in your models only those columns which you want to encryption.

use App\Traits\Encryptable;
class ABC extends Model {

use Encryptable;

protected $encryptable= ['name', 'description'];

}



创建一个帮助文件,并在该文件中创建可从任何视图访问的函数。
关注创建帮助程序的链接: https://laravelcode.com/post/how-to- create-custom-helper-in-laravel-55 </ p>

  function decryptText($ text){
return decrypt($ text);
}
</ code> </ pre>

并使用内部视图,如下所示:</ p>

  @foreach($ employees as $ employee)
{{decryptText ($ employee-&gt; encryptedText)}}
{{$ employee-&gt; name}}
@ endforeach
</ code> </ pre>
</ div>

展开原文

原文

Create one helper file and inside that file create function that will be accessible from any views. Follow this link for create helper: https://laravelcode.com/post/how-to-create-custom-helper-in-laravel-55

function decryptText($text) {
   return decrypt($text);
}

and use inside view like this :

@foreach($employees as $employee)
 {{decryptText($employee->encryptedText)}}
 {{$employee->name}}
@endforeach

douwen8118
douwen8118 “哟dawg,我听说你喜欢帮助者,所以我帮助你帮忙,所以你可以帮助你......”
2 年多之前 回复
duanniwu7730
duanniwu7730 你在那里做了什么叫做代码膨胀。
2 年多之前 回复
douzuqin3467
douzuqin3467 function decryptText($ text){return decrypt($ text); //如果你有多个逻辑,比如// decrypt(anotherfunction(anotherfunction($ text)))就像这样......}
2 年多之前 回复
dongquweng5152
dongquweng5152 使用decryptText($ text)而不是解密($ text)的好处是什么?
2 年多之前 回复
dongwuge6201
dongwuge6201 只有在多次使用相同逻辑并且想要全局修改解密和加密逻辑时,才会使用完全。 其他明智的你必须修改到多个位置。 它很方便只需在一个地方进行更改就可以选择全部应用程序。
2 年多之前 回复
du1913
du1913 完全不需要的功能。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问