چگونه ستون های دیتابیس لاراول رو رمزگذاری کنیم

درود بیکران بر شما. امروز میخوایم ببینیم چطور میشه راحت و سریع ستون های دیتابیس در فریم ورک لاراول رو رمزگذاری کرد.

برای این کار به یک پکیج نیازمندیم که یکی از اعضای جامعه لاراول نوشته. ابتدا پکیج رو به پروژه اضافه میکنیم.

composer require betterapp/laravel-db-encrypter

این پکیج اومده و یک trait ساخته که بتونیم به مدل اضافه کنیم. بعد از اضافه کردن تریت به مدل فقط کافیه که یک property به مدلمون اضافه کنیم و داخلش اسم ستون هایی که میخوایم رمزگذاری بشه رو قرار بدیم.

<?php
use betterapp\LaravelDbEncrypter\Traits\EncryptableDbAttribute;

class Post extends Eloquent {
        use EncryptableDbAttribute;
       
        /** @var array The attributes that should be encrypted/decrypted */
        protected $encryptable = [
            'mobile', 
            'email',
        ];
}

حالا سوال اینه که چجوری کار میکنه. این پکیج اومده و چند تا از متد های لاراول رو بازنویسی کرده تا روند رمزگذاری کردن اعمال بشه.

به طول مثال زمانی که میخوایم یک مدل جدید بسازیم و ذخیره اش کنیم این پکیج به طور خودکار فیلد هایی که داخل متغیر $encryptable هست رو رمزگذاری میکنه و در دیتابیس ذخیره میکنه.

<?php
$post = Post::query()->create([
    &quottitle&quot => &quotFoo Bar&quot,
    &quotmobile&quot => &quot09120000000&quot, /** این فیلد به طور خودکار رمزگذاری میشه */
    &quotemail&quot => &quotemail@example.com&quot, /** این فیلد به طور خودکار رمزگذاری میشه */
]);

همینطور زمانی که یک مدل رو فراخوانی میکنیم فیلد مربوطه به طور رمزگشایی شده(decrypted) برگردونده میشه.

<?php
$post = Post::query()->find(1);
dd($post->getAttribute(&quotmobile&quot));

// 09120000000

این پکیج برای رمزگذاری و رمزگشایی مقدار های یک فیلد از کلاس Crypt لاراول استفاده میکنه. همچنین خود Crypt برای رمزگذاری و رمزگشایی از مقدار APP_KEY داخل فایل .env استفاده میکنه.

پس اینجا مهمه که از مقدار داخل APP_KEY مراقبت بشه و به دست افراد قابل اعتماد سپرده بشه. همچنین اگر این کد گم بشه یا حذف بشه تموم فیلد هایی که رمزگذاری کردید قابل بازگشت نیست و کار به جاهای باریک میکشه.

نکته:‌ این پکیج در هنگام ساختن سطر در دیتابیس به صورت دسته جمعی(bulk insert) کار نمیکنه. پس باید خودتون در هنگام ساختن یک سطر در دیتابیس از کلاس Crypt استفاده کنید.

رمزگذاری کردن مقدار های قبلی یک ستون دیتابیس

اگر از قبل توی دیتابیستون سطر هایی وجود داره که هنوز رمزگذاری نشده میتونین با اجرا کردن کد زیر مقدار های قبلی رو رمزگذاری کنید.

<?php
$posts = Post::all();
foreach ($posts as $post){
    if($mobile = $post->getAttribute('mobile')){
         $post->update([
            'mobile' => $mobile
         ]);
    }
}


استفاده از این پکیج در دیتابیس MongoDB

احتمالا برای بعضی از شما که از دیتابیس MongoDB برای سیستم لاراول استفاده میکنید این مشکل پیش بیاد که پکیج jenssegers/mongodb و این پکیج با هم سازگار نباشن. برای حل این مشکل من از پکیج بالا یک فورک گرفتم و تغییرات لازم رو دادم تا بتونین توی مونگو ازش استفاده کنید.

نحوه نصب پکیج

composer require payamjafari/laravel-db-encrypter

این پکیج هم مثل قبلی هست و برای استفاده با پکیج jenssegers/mongodb آماده هست.


خب این هم پایان مطلب. تا درودی دیگر بدرود.