اذهب إلى المحتوى

السؤال

Recommended Posts

  • 2
نشر

يوجد نوعين من خوازرميات التشفير، الأول تشفير في إتجاه واحد، أي يتم تشفير النصوص ولا يمكن فك تشفيرها عمليًا ومن هذه الخوارزميات SHA-256 و md5 و bcrypt التي يستعملها Laravel في حفظ كلمات المرور، ويمكن إستخدامها بشكل مباشر عبر دالة bcrypt:

$password = "secret";
$hashed_password = bcrypt($password);	// $2y$12$j50r.d/Db1HE.lR4TkTbP.lCGlsMjP7NMQDLP.jE1x9kqz7Ltwyr2 

ويمكن التأكد من صحة كلمة المرور فيما بعد عبر Hash:check

if (Hash::check('plain-text-password', $hashed_password)) {
    // The passwords match...
}

أما النوع الثاني فهو التشفير في إتجاهين، أي يمكن تشفير النصوص وفك تشفيرها عبر كلمة سر معينة تسمى مفتاح فك التشفير وتكون هي نفسها قيمة الخاصية APP_KEY  في ملف env، يوفر Laravel خدمة تشفير Laravel's encrypter عبر OpenSSL بإستخدام الخوارزميات AES-256 وAES-128 وكل القيم التي يتم تشفيرها يتم تسجيلها بكود مصادقة MAC، بحيث لا يمكن تعديل قيمتها الأساسية أو العبث بها بمجرد تشفيرها.

ملاحظة: لا تستخدم أبدًا هذه الطريقة لتشفير كلمات المرور وذلك لأنه يمكن فك تشفيرها بمجرد معرفة قيمة APP_KEY، وقد حدثت الكثير من عمليات الإختراق في عشرات المواقع لأسباب مشابهة، وإنما تستعمل هذه الطريقة في تشفير القيم التي تحتاجها في وقت لاحق مثل API Tokens.

للبدء في تشفير القيم يمكنك أن تستخدم دالة encryptString التي يوفرها الصنف Illuminate\Support\Facades\Crypt، وهنا مثال من وثائق Laravel الرسمية:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Crypt;

class DigitalOceanTokenController extends Controller
{
    /**
     * Store a DigitalOcean API token for the user.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function storeSecret(Request $request)
    {
        $request->user()->fill([
            'token' => Crypt::encryptString($request->token),
        ])->save();
    }
}

يمكن أيضًا إستخدام دالة decryptString من نفس الصنف لفك تشفير النصوص، وفي حالة حدوث خطأ سيتم إطلاق خطأ من نوع Illuminate\Contracts\Encryption\DecryptException، مثال:

use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Support\Facades\Crypt;

try {
    $decrypted = Crypt::decryptString($encryptedValue);
} catch (DecryptException $e) {
    return Redirect::back()->withErrors(['msg', 'Invalid decryption key']);
}

بالتوفيق.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...