التشفير في Laravel
المقدمة
يستخدم مُشفّر Laravel مكتبة التشفير OpenSSL لتوفير تشفير AES-256 و AES-128. ننصحك بشدة باستخدام تسهيلات التشفير المضمنة في Laravel وعدم محاولة إنشاء خوارزميات التشفير المنشأة محليًا والخاصة بك. يتم توقيع جميع قيم Laravel المشفرة باستخدام رسالة رمز الاستيثاق (message authentication code - MAC) بحيث لا عدل قيمها الأساسية بمجرد تشفيرها.
الضبط
قبل استخدام مُشفّر Laravel، اضبط خيار المفتاح ((key في ملف الإعدادات config/app.php
. استخدم الأمر php artisan key:generate
لإنشاء هذا المفتاح لأن أمر Artisan
سيستخدم مولد بايت عشوائي آمن الخاص بلغة PHP لإنشاء مفتاحك. إذا لم تُعيّن هذه القيمة بشكل صحيح، فإن جميع القيم المشفرة بواسطة Laravel ستكون غير آمنة.
باستخدام المُشفّر Encrypter
تشفير قيمة
يمكنك تشفير قيمة باستخدام المساعد encrypt
. تشفر جميع القيم المشفرة باستخدام مكتبة التشفير OpenSSL وشفرة AES-256-CBC. علاوة على ذلك، توقع جميع القيم المشفرة باستخدام رسالة رمز الاستيثاق (MAC) للكشف عن أي تعديلات في السلسلة النصية المشفرة:
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* تسجيل رسالة سرية للمستخدم
*
* @معامل طلب $request
* @معامل عدد $id
* @القيمة المعادة
*/
public function storeSecret(Request $request, $id)
{
$user = User::findOrFail($id);
$user->fill([
'secret' => encrypt($request->secret)
])->save();
}
}
?>
تشفير دون سَلْسَلَة
مرر القيم المشفرة خلال السَلْسَلَة أثناء التشفير، مما يسمح بتشفير الكائنات والمصفوفات. وبالتالي، سيحتاج عملاء غير PHP الذين يتلقون قيمًا مشفرة إلى إلغاء سَلْسَلَة البيانات. إذا كنت ترغب في تشفير وفك تشفير القيم بدون السَلْسَلَة، فيمكنك استخدام أساليب encryptString
و decryptString
الخاصة بواجهة Crypt
:
use Illuminate\Support\Facades\Crypt;
$encrypted = Crypt::encryptString('Hello world.');
$decrypted = Crypt::decryptString($encrypted);
فك تشفير قيمة
يمكنك فك تشفير القيم باستخدام مساعد فك التشفير. إذا تعذر فك تشفير القيمة بشكل صحيح، على سبيل المثال عندما تكون رسالة رمز الاستيثاق ((MAC غير صالحة، فسيرمى الاستثناء Illuminate\Contracts\Encryption\DecryptException
:
use Illuminate\Contracts\Encryption\DecryptException;
try {
$decrypted = decrypt($encryptedValue);
} catch (DecryptException $e) {//
}