Menu

Wednesday, November 27, 2019

[Laravel - Model] การเข้ารหัสและถอดรหัสค่าของฟิลด์ใน Laravel Model
[Laravel - Model] Field Values Encryption and Decryption in Laravel Model

ในบางกรณี เราต้องการรักษาความลับของข้อมูล โดยอนุญาตให้เฉพาะผู้ที่เกี่ยวข้องเท่านั้นที่สามารถดูและแก้ไขได้ ระบบส่วนใหญ่จึงจำกัดสิทธิ์การใช้งานของแต่ละผู้ใช้งานภายใน application

อย่างไรก็ตาม ระบบดังกล่าวยังคงเก็บข้อมูลจริงลงฐานข้อมูลโดยไม่มีการเข้ารหัสใดๆ ทำให้ Database Admin ยังสามารถเข้าดูข้อมูลและแก้ไขได้

การเข้ารหัสข้อมูลก่อนเก็บลงฐานข้อมูล จึงเป็นการเพิ่มความปลอดภัยของข้อมูลอีกขั้นนึง

สำหรับ Laravel Model ที่มี function กลางสำหรับการดึงค่าข้อมูลและเก็บข้อมูลของ Fields ต่างๆ ทำให้การเข้ารหัสและถอดรหัสนั้นทำได้ง่ายขึ้นมาก เราเพียงเขียน Trait แล้วนำไปใส่ใน Model พร้อมกับกำหนด Fields ที่เราต้องการเข้ารหัสเท่านั้น

โค้ดของ Trait เป็นดังนี้
<?php

namespace App\Traits;

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 (isset($this->encryptable) && 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 (isset($this->encryptable) && 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();
        if (isset($this->encryptable)) {
            foreach ($this->encryptable as $key) {
                if (isset($attributes[$key])) {
                    $attributes[$key] = decrypt($attributes[$key]);
                }
            }
            return $attributes;
        }
    }
}

โดยที่
  • getAttribute($key) เป็น function ที่ถูกเรียกโดยอัตโนมัติ เมื่อมีการดึงค่า Attribute
  • setAttribute($key, $value) เป็น function ที่ถูกเรียกโดยอัตโนมัติ เมื่อมีการตั้งค่า Attribute
  • attributesToArray() เป็น function ที่ถูกเรียกโดยอัตโนมัติ เมื่อมีแปลง Attributes ทั้งหมดของ Model ไปเป็น Array
วิธีการใช้งาน Trait ข้างต้นเป็นดังนี้
  1. ประกาศ use App\Traits\Encryptable;
  2. ใส่ use Encryptable; ใน Model Class
  3. ตั้งค่า fields ที่ต้องการเข้ารหัสใน $encryptable
ตัวอย่างการใช้งาน Trait ข้างต้นเป็นดังนี้
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use App\Traits\Encryptable;
class UserSalary extends Model
{
    use Encryptable;
    protected $fillable = [
        'user_id',
        'payroll',
        'start_at',
        'end_at',
    ];
    protected $encryptable = [
        'payroll',
    ];
}
สำหรับคนที่ต้อง Package ที่สามารถติดตั้งได้เลย เข้าไปที่ Laravel Model Encryptable

No comments:

Post a Comment