دليل bcrypt في Go: تشفير كلمات المرور مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

bcrypt في Go: الدليل الكامل لتشفير كلمات المرور

أمان بيانات المستخدمين هو أحد الركائز الأساسية في تطوير الويب الحديث. تخزين كلمات المرور كنص عادي غير مقبول، والتشفير البسيط باستخدام MD5 أو SHA-1 أصبح غير آمن منذ زمن بسبب ضعفه أمام هجمات التخمين. مكتبة bcrypt في Go تقدم خوارزمية تشفير تكيفية موثوقة ومختبرة عبر الزمن، تقاوم هجمات القاموس وهجمات جداول قوس قزح.

تم تطوير خوارزمية bcrypt في عام 1999 بواسطة نيل بروفوس وديفيد مازيير بناءً على تشفير Blowfish. ميزتها الأساسية هي التعقيد التكيفي: يمكنك زيادة عدد مرات التكرار في التشفير، مما يجعل تخمين كلمات المرور أكثر تكلفة مع تزايد القوة الحاسوبية. في نظام Go البيئي، المكتبة الرسمية golang.org/x/crypto/bcrypt هي امتداد رسمي مدعوم من فريق مطوري Go.

في هذا المقال، سنشرح بالتفصيل جميع جوانب العمل مع bcrypt في Go: من التثبيت والاستخدام الأساسي إلى التقنيات المتقدمة والأخطاء الشائعة. ستتعلم كيفية تشفير كلمات المرور بشكل صحيح، ومقارنتها مع التجزئات، واختيار التكلفة المثلى (cost)، ودمج bcrypt في تطبيقاتك الحقيقية.

التثبيت

مكتبة bcrypt في Go ليست جزءًا من المكتبة القياسية، لكنها جزء من الوحدة الفرعية الرسمية x/crypto. يتم التثبيت بأمر واحد:

go get golang.org/x/crypto/bcrypt

بعد تنفيذ هذا الأمر، سيظهر التابع في ملف go.mod الخاص بك، ويمكنك استيراد الحزمة في الكود:

import "golang.org/x/crypto/bcrypt"

تأكد من أن لديك Go الإصدار 1.13 أو أعلى (يُوصى بـ 1.21+). إذا كنت تستخدم الوحدات (وهو المعيار في 2024)، سيتم جلب التابع تلقائيًا.

بداية سريعة: مثال عملي بسيط

لنبدأ بأبسط مثال: تشفير كلمة مرور والتحقق منها. هذا هو الأساس الذي ستستخدمه في أي مشروع.

package main

import (
    "fmt"
    "log"
    "golang.org/x/crypto/bcrypt"
)

func main() {
    // كلمة المرور الأصلية للمستخدم
    password := []byte("mySecretPassword123!")

    // تشفير كلمة المرور بالتكلفة الافتراضية (10)
    hashedPassword, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("التجزئة: %s\n", hashedPassword)

    // التحقق من كلمة المرور الصحيحة
    err = bcrypt.CompareHashAndPassword(hashedPassword, password)
    if err != nil {
        fmt.Println("كلمة المرور غير متطابقة!")
    } else {
        fmt.Println("✓ كلمة المرور متطابقة!")
    }

    // التحقق من كلمة مرور خاطئة
    wrongPassword := []byte("wrongPassword")
    err = bcrypt.CompareHashAndPassword(hashedPassword, wrongPassword)
    if err != nil {
        fmt.Println("✗ كلمة المرور غير متطابقة (كما هو متوقع)")
    }
}

هذا الكود يقوم بثلاثة أشياء: إنشاء التجزئة، التحقق من كلمة المرور الصحيحة، والتأكد من رفض كلمة المرور الخاطئة. لاحظ أن GenerateFromPassword يولد تلقائيًا ملحًا عشوائيًا ويدمجه في التجزئة، لذلك ستحصل على تجزئات مختلفة في كل مرة لنفس كلمة المرور.

الدوال والوظائف الأساسية

توفر حزمة bcrypt واجهة برمجية صغيرة ولكنها مدروسة بعناية. دعنا نستعرض جميع الدوال الأساسية مع أمثلة.

1. GenerateFromPassword

التوقيع: func GenerateFromPassword(password []byte, cost int) ([]byte, error)

الوصف: الدالة الرئيسية لتشفير كلمة المرور. تأخذ كلمة المرور كمصفوفة بايتات والتكلفة (cost) وهي قيمة لوغاريتمية لعدد مرات التكرار. تُرجع التجزئة بتنسيق bcrypt القياسي (تحتوي على الملح والتكلفة

توصيات