[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
Jean Silva
Criador Jean Silva 24/08/2022

Opa Professor, boa tarde!

Têm alguma aula sua sobre Encrypt e Decrypt?.

Preciso encryptar um field CPF, e fazer um decrypt.

A doc é bem resumida, e não encontrei muito na net.

Se tiver um jeito de fazer via model/request e depois decryptar no resource.

Meu controller:

public function store(StorePeopleRequest $request)
    {
        $this->authorize('create', People::class);
        $people = People::create($request->validated());
        return new PeopleResource($people);
    }

Model:

    protected $fillable = [
        'name', 'cpf', 'rg', 'cnh', 'phone_number', 'email', 'address', 'people_type_id', 'company_id'
    ];

Request:

public function rules()
    {
        return [
            'name'                 => ['required', 'unique:people', 'max:100'],
            'phone_number'         => ['required', 'unique:people', 'max:14'],
            'cpf'                  => ['required', 'unique:people', 'max:14'],
            'rg'                   => ['required', 'unique:people', 'max:30'],
            'cnh'                  => ['required', 'unique:people', 'max:14'],
            'email'                => ['required', 'unique:people', 'max:50'],
            'address'              => ['required', 'max:14'],
            'people_type_id'       => ['required'],
            'company_id'           => ['required'],
        ];
    }

 

Criador Jean Silva 24/08/2022

Resource:

    public function toArray($request)
    {
        return [
            'id'                         => $this->id,
            'name'                       => $this->name,
            'cpf'                        => $this->cpf,
            'rg'                         => $this->rg,
            'cnh'                        => $this->cnh,
            'phone_number'               => $this->phone_number,
            'email'                      => $this->email,
            'address'                    => $this->address,
            'people_type_id'             => $this->people_type_id,
            'people_type'                => $this->peopleType->type,
            'people_type_description'    => $this->peopleType->description,
            'company_id'                 => $this->company_id,
            'company_name'               => $this->company->name,
            'company_cnpj'               => $this->company->cnpj,
            'company_address'            => $this->company->address,
            'company_status'             => $this->company->status,
            'created_at'                 => $this->created_at->format('d-m-Y H:i:s'),
            'updated_at'                 => $this->updated_at->format('d-m-Y H:i:s'),
            'deleted_at'                 => $this->updated_at->format('d-m-Y H:i:s')
        ];

Grato.

Jean Silva
Manager Carlos Ferreira 24/08/2022

Olá, Jean!
Tudo bem?

Você pode combinar 4 recursos.

1) Crypt para criptografar os dados:
// use Illuminate\Support\Facades\Crypt;
$encryptedValue = Crypt::encryptString($value);

2) O mesmo Crypt para descriptografar:
// use Illuminate\Contracts\Encryption\DecryptException;
try {
    $decrypted = Crypt::decryptString($encryptedValue);
} catch (DecryptException $e) {
    //
}

3) Você pode usar mutator para criprografar os dados antes de persistir no banco:
https://laravel.com/docs/9.x/eloquent-mutators#defining-a-mutator

4) E um Acessor para descriptografar quando recuperar do banco:
https://laravel.com/docs/9.x/eloquent-mutators#defining-an-accessor

Se tiver dúvidas em como usar qualquer um, me retorna que te ajudo amigo.

Carlos Ferreira
Criador Jean Silva 24/08/2022

Olá professor, bom dia!

Obrigado pela dica.

Consegui fazer a inclusão corretamente no banco e fazer o decrypt também no PeopleList.vue, portanto ao tentar fazer no PeopleEdit.vue, eu tenho o seguinte erro:

the payload is invalid decrypt / Illuminate \ Encryption \ DecryptException Invalid data.

Pesquisando encontrei que poderia ser o tipo do meu campo, que é string (oracle)varchar2(1000), alterei para um longText que é um CLOB, no clob ao inserir já aparece o erro:

message: "Error Code    : 932\r\nError Message : ORA-00932: inconsistent datatypes

Model:

protected $casts = [
        'cpf' => 'string',
    ];

    public function setCpfAttribute($value)
    {
        $this->attributes['cpf'] = Crypt::encrypt($value);
    }

Migrations:

 public function up()
    {
        Schema::create('people', function (Blueprint $table) {
            $table->id();
            $table->string('name', 255);
            $table->longText('cpf');

Resource:

  $cpf        = Crypt::decrypt($this->cpf);
        // $cpf            = getOriginal($this->cpf);

        // $cpf            = $this->cpf;
        // $encryptedCpf   = encrypt($cpf);
        // $dencryptedCpf  = decrypt($encryptedCpf);

        // $cpf = $dencryptedCpf;

        return [
            'id'                         => $this->id,
            'name'                       => $this->name,
            'cpf'                        => $cpf,
Jean Silva
Criador Jean Silva 24/08/2022

Notei que isso ocorre apenas no metodo show, passando apenas o id, pois o metodo index que retorna todos, passa normalmente.

Meu controller metodo Show:

    public function show(People $people)
    {
        $this->authorize('view', $people);
        return new PeopleResource($people);
    }

 

 

 

 

Jean Silva
Criador Jean Silva 24/08/2022

Olá professor, consegui fazer funcionar.

O que estou preso é na situação da validação, como que eu vou validar no request?.

'cpf'                  => ['required', 'unique:people'],
Jean Silva
Manager Carlos Ferreira 24/08/2022

Boa amigo.

Como os dados estão criptografados no banco, você vai precisar criar uma validação personalizada, para pegar o value da request, criptografar e validar com o que já existe no banco.

https://academy.especializati.com.br/aula/criar-validacao-personalizada-no-laravel-tenant-unique

Carlos Ferreira
Criador Jean Silva 24/08/2022

Olá professor, bom dia!

Estou com um problema na hora do update, por algum motivo ele não resolve a situação da crypt.

  1. file"C:\\laragon\\www\\Back-end\\gateway-web-backend\\vendor\\laravel\\framework\\src\\Illuminate\\Encryption\\Encrypter.php"
  2. line214
  3. message"The payload is invalid."

Model

 

 protected $casts = [

        'cpf' => 'string',

    ];

    public function setCpfAttribute($value) {

        $this->attributes['cpf'] = Crypt::encrypt($value);

    }

 

UpdateRequest

public function rules()
    {
        return [
            'name'                 => ['required', 'max:100'],
            'phone_number'         => ['required', 'max:14'],
            'cpf'                  => ['required', 'max:14'],
            'rg'                   => ['required', 'max:30'],
            'cnh'                  => ['required', 'max:14'],
            'email'                => ['required', 'max:50'],
            'address'              => ['required', 'max:255'],
            'people_types_id'      => ['required'],
            'companies_id'         => ['required'],
        ];
    }

 

 

Jean Silva
Manager Carlos Ferreira 24/08/2022

E qual o valor dessa variável $value?
Porque se já estiver retornando o valor criptografado, ao tentar criptografar novamente, é onde acontece a exception.

Debuga ae:
public function setCpfAttribute($value)
{
    dd($value);

    $this->attributes['cpf'] = Crypt::encrypt($value);
}

Carlos Ferreira
Criador Jean Silva 24/08/2022

Obrigado Professor.

Jean Silva
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!