Laravel - การเข้ารหัส

การเข้ารหัสเป็นกระบวนการในการแปลงข้อความธรรมดาเป็นข้อความโดยใช้อัลกอริทึมบางอย่างเพื่อให้ผู้ใช้รายที่สามไม่สามารถอ่านข้อมูลได้ สิ่งนี้มีประโยชน์สำหรับการส่งข้อมูลที่ละเอียดอ่อนเนื่องจากมีโอกาสน้อยที่ผู้บุกรุกจะกำหนดเป้าหมายข้อมูลที่ถ่ายโอน

การเข้ารหัสดำเนินการโดยใช้กระบวนการที่เรียกว่า Cryptography. ข้อความที่จะเข้ารหัสเรียกว่าPlain Text และข้อความหรือข้อความที่ได้รับหลังจากเรียกการเข้ารหัส Cipher Text. เรียกกระบวนการแปลงข้อความรหัสเป็นข้อความธรรมดาDecryption.

Laravel ใช้ AES-256 และ AES-128ผู้เข้ารหัสซึ่งใช้ Open SSL สำหรับการเข้ารหัส ค่าทั้งหมดที่รวมอยู่ใน Laravel จะลงนามโดยใช้โปรโตคอลMessage Authentication Code เพื่อให้ไม่สามารถแก้ไขค่าพื้นฐานได้เมื่อเข้ารหัสแล้ว

การกำหนดค่า

คำสั่งที่ใช้ในการสร้างไฟล์ key ใน Laravel แสดงไว้ด้านล่าง -

php artisan key:generate

โปรดทราบว่าคำสั่งนี้ใช้ตัวสร้างไบต์แบบสุ่มที่ปลอดภัยของ PHP และคุณจะเห็นผลลัพธ์ดังที่แสดงในภาพหน้าจอด้านล่าง

คำสั่งที่ระบุข้างต้นช่วยในการสร้างคีย์ที่สามารถใช้ในเว็บแอปพลิเคชัน สังเกตภาพหน้าจอด้านล่าง -

บันทึก

ค่าสำหรับการเข้ารหัสถูกจัดตำแหน่งอย่างเหมาะสมในไฟล์ config/app.php ซึ่งมีพารามิเตอร์สองตัวสำหรับการเข้ารหัส ได้แก่ key และ cipher. หากค่าที่ใช้คีย์นี้ไม่ได้รับการจัดแนวอย่างเหมาะสมค่าทั้งหมดที่เข้ารหัสใน Laravel จะไม่ปลอดภัย

กระบวนการเข้ารหัส

การเข้ารหัสค่าสามารถทำได้โดยใช้ไฟล์ encrypt helperในคอนโทรลเลอร์ของคลาส Laravel ค่าเหล่านี้ถูกเข้ารหัสโดยใช้ OpenSSL และ AES-256 cipher ค่าที่เข้ารหัสทั้งหมดจะลงนามด้วย Message Authentication code (MAC) เพื่อตรวจสอบการแก้ไขของสตริงที่เข้ารหัส

รหัสที่แสดงด้านล่างกล่าวถึงในคอนโทรลเลอร์และใช้เพื่อเก็บความลับหรือข้อความที่ละเอียดอ่อน

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class DemoController extends Controller{
   **
      * Store a secret message for the user.
      *
      * @param Request $request
      * @param int $id
      * @return Response
   */
   
   public function storeSecret(Request $request, $id) {
      $user = User::findOrFail($id);
      $user->fill([
         'secret' => encrypt($request->secret)
      ])->save();
   }
}

กระบวนการถอดรหัส

การถอดรหัสของค่าทำได้ด้วย decrypt helper. สังเกตโค้ดบรรทัดต่อไปนี้ -

use Illuminate\Contracts\Encryption\DecryptException;

// Exception for decryption thrown in facade
try {
   $decrypted = decrypt($encryptedValue);
} catch (DecryptException $e) {
   //
}

โปรดทราบว่าหากกระบวนการถอดรหัสไม่สำเร็จเนื่องจากมีการใช้ MAC ที่ไม่ถูกต้องข้อยกเว้นที่เหมาะสมจะถูกโยนทิ้งไป