attakinsky/encryptable

这是一个简单的特性,允许您在Eloquent模型中即时加密和解密多个字段。

1.0.0 2019-06-05 18:10 UTC

This package is auto-updated.

Last update: 2024-09-06 08:13:33 UTC


README

这是一个简单的特性,允许您在Eloquent模型中即时加密和解密多个字段。

这是为了解决其他人无法解决的问题:通过API解密答案,特别是在Lumen中。这不仅仅是一个Eloquent的加密包。

在Laravel/Lumen 5.5+上安装

composer require attakinsky/encryptable

用法

  1. 在任意模型中使用 use Attakinsky\Encryptable\Encryptable
  2. 包含特性 use Encryptable;
  3. 定义一个名为 $encryptable 的数组,其中包含必须加密/解密的字段。

示例

<?php

namespace App;

use Attakinsky\Encryptable\Encryptable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable, Encryptable;

    /**
     * The attributes that should be encrypted on database.
     *
     * @var array
     */
    protected $encryptable = [
        'name', 'email',
    ];

太棒了!

现在,您的数据将在保存时加密,在加载时解密。

演示

让我们开始一个Artisan tinker会话

php artisan tinker
Psy Shell v0.9.9 (PHP 7.3.5-1+ubuntu16.04.1+deb.sury.org+1 — cli) by Justin Hileman

加密修饰符

创建一个用户

>>> $x = new User();
[!] Aliasing 'User' to 'App\User' for this Tinker session.
=> App\User {#3195}
>>> $x->name = "John Doe";
=> "John Doe"
>>> $x->email = "johndoe_encrypted@gmail.com";
=> "johndoe_encrypted@gmail.com"
>>> $x->password = Hash::make('123456');
=> "$2y$10$CM2qTNmUhbmmLFqiwWfvbuzTQO9sz4hmDo4COWK2HEQdWMhkLp7YO"
>>> $x->save();
=> true

解密访问器

名称和电子邮件字段已加密。您可以使用任何工具如控制台、PHPMyAdmin、Adminer等进行验证。

>>> $x = User::all();
=> Illuminate\Database\Eloquent\Collection {#3196
     all: [
       App\User {#3197
         id: 1,
         name: "eyJpdiI6InlvRWxQZ2ZcL1VBM0lqNW5pVkZxZ2d3PT0iLCJ2YWx1ZSI6ImtjUDNGRmVLNTF1clM0NllUb2FWWFI1WlMrandIaTVcL2lZTXkzSmVoWU5ZPSIsIm1hYyI6ImJmMjg3MzM3ZDE5OWJlMTkwNjg3MjBmNWQ0ZTcxYmY3MWY1ZjY0NmI4ZjhjMzg1NzAyZjY0NDE2MjE1NDNjNDIifQ==",
         email: "eyJpdiI6IklDRjJIUlBqaHp4dkJ3Z3ZTcWdmdVE9PSIsInZhbHVlIjoiaW5GUXVGcjJudE1GczRBYnFhN1V2RTRZUlRtT1czUFNWUDVnQ21qSEx1Zz0iLCJtYWMiOiIzZThmY2IyNzM3MTcxMjUwNmVmODQ1NDliNzNjN2MxZjFkMWY0MDA1MDZjZTAzNjI3YmRkZTcxM2FjNjA5ZWMwIn0=",
         email_verified_at: null,
         created_at: "2019-06-04 21:28:39",
         updated_at: "2019-06-04 21:28:39",
       },
     ],
   }
>>>
>>> $x = User::find(1);
=> App\User {#3198
     id: 1,
     name: "eyJpdiI6InlvRWxQZ2ZcL1VBM0lqNW5pVkZxZ2d3PT0iLCJ2YWx1ZSI6ImtjUDNGRmVLNTF1clM0NllUb2FWWFI1WlMrandIaTVcL2lZTXkzSmVoWU5ZPSIsIm1hYyI6ImJmMjg3MzM3ZDE5OWJlMTkwNjg3MjBmNWQ0ZTcxYmY3MWY1ZjY0NmI4ZjhjMzg1NzAyZjY0NDE2MjE1NDNjNDIifQ==",
     email: "eyJpdiI6IklDRjJIUlBqaHp4dkJ3Z3ZTcWdmdVE9PSIsInZhbHVlIjoiaW5GUXVGcjJudE1GczRBYnFhN1V2RTRZUlRtT1czUFNWUDVnQ21qSEx1Zz0iLCJtYWMiOiIzZThmY2IyNzM3MTcxMjUwNmVmODQ1NDliNzNjN2MxZjFkMWY0MDA1MDZjZTAzNjI3YmRkZTcxM2FjNjA5ZWMwIn0=",
     email_verified_at: null,
     created_at: "2019-06-04 21:28:39",
     updated_at: "2019-06-04 21:28:39",
   }

在此阶段,当您需要时,Attakinsky/Encryptable访问器的权限将允许解密。例如在blade中:{{ $user->name }} 将打印 John Doe

Lumen和API支持。

但是,如果您需要带有原始数据的响应,则标准访问器不会对其进行解密。Attakinsky/Encryptable包括一个额外的批量访问器,允许解密将不会调用但以JSON格式发送作为响应的数据。

>>> $x->toArray();
=> [
     "id" => 1,
     "name" => "John Doe",
     "email" => "johndoe_encrypted@gmail.com",
     "email_verified_at" => null,
     "created_at" => "2019-06-04 21:28:39",
     "updated_at" => "2019-06-04 21:28:39",
   ]
>>> 
>>> $x->toJson();
=> "{"id":1,"name":"John Doe","email":"johndoe_encrypted@gmail.com","email_verified_at":null,"created_at":"2019-06-04 21:28:39","updated_at":"2019-06-04 21:28:39"}"

⚠ 注意!

加密100%依赖于您.env文件中的 APP_KEY。因此,您的 APP_KEY 不应该更改。如果发生这种情况,您的信息将无法解密。

请始终记住,加密数据的关键是唯一可以解密它的关键。