التشفير في Go (Golang): دليل شامل للتشفير والتجزئة
توفر لغة Go (Golang) مكتبة قياسية قوية crypto، والتي تتضمن جميع الأدوات اللازمة لتنفيذ الحماية التشفيرية للبيانات. في هذه المقالة، سنقوم بتحليل مفصل للوظائف الرئيسية للعمل مع التشفير والتجزئة في Go، بما في ذلك التشفير المتماثل (AES)، والتشفير غير المتماثل (RSA)، ووظائف التجزئة (SHA-256)، وحماية كلمات المرور باستخدام bcrypt.
1. تجزئة البيانات في Go
التجزئة هي تحويل أحادي الاتجاه للبيانات إلى طول ثابت. في Go، يتم استخدام حزمة crypto/sha256 (وعائلات SHA الأخرى) لهذا الغرض.
مثال: تجزئة SHA-256 لسلسلة نصية
package main
import ( "crypto/sha256" "fmt")
func main() { data := "PythonLib.ru — موقع تعليمي" hash := sha256.Sum256([]byte(data)) fmt.Printf("SHA-256: %x", hash)}المخرجات: SHA-256: 3c4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4
للتجزئة التدفقية (للملفات الكبيرة)، استخدم واجهة hash.Hash:
package main
import ( "crypto/sha256" "fmt" "io" "strings")
func main() { h := sha256.New() reader := strings.NewReader("تيار بيانات للتجزئة") io.Copy(h, reader) fmt.Printf("SHA-256 تدفقي: %x", h.Sum(nil))}2. حماية كلمات المرور باستخدام bcrypt
لتخزين كلمات المرور، لا تستخدم أبدًا التجزئة العادية (SHA-256). استخدم bcrypt - خوارزمية مع ملح (salt) وتعقيد تكيفي. في Go، يتم تنفيذ ذلك بواسطة حزمة golang.org/x/crypto/bcrypt.
التثبيت:
go get golang.org/x/crypto/bcryptمثال على تجزئة والتحقق من كلمة المرور:
package main
import ( "fmt" "golang.org/x/crypto/bcrypt")
func main() { password := "MySecurePass123!"
// التجزئة (التكلفة الافتراضية = 10) hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) if err != nil { panic(err) } fmt.Printf("bcrypt hash: %s", hash)
// التحقق من كلمة المرور err = bcrypt.CompareHashAndPassword(hash, []byte(password)) if err != nil { fmt.Println("كلمة مرور غير صحيحة") } else { fmt.Println("كلمة المرور صحيحة!") }}3. التشفير المتماثل AES-GCM
AES (معيار التشفير المتقدم) هو خوارزمية متماثلة. الوضع الموصى به هو GCM (وضع العداد Galois)، الذي يوفر المصادقة (AEAD). استخدم الحزم crypto/aes و crypto/cipher.
مثال على تشفير وفك تشفير AES-256-GCM:
package main
import ( "crypto/aes" "crypto/cipher" "crypto/rand" "encoding/hex" "fmt" "io")
func main() { key := []byte("مفتاح 32 بايت لـ AES-256!!!") // 32 بايت plaintext := []byte("رسالة سرية لـ PythonLib")
// التشفير ciphertext, nonce := encryptAESGCM(key, plaintext) fmt.Printf("مشفر: %s", hex.EncodeToString(ciphertext))
// فك التشفير decrypted, err := decryptAESGCM(key, ciphertext, nonce) if err != nil { panic(err) } fmt.Printf("مفكوك التشفير: %s", decrypted)}
func encryptAESGCM(key, plaintext []byte) (ciphertext, nonce []byte) { block, _ := aes.NewCipher(key) gcm, _ := cipher.NewGCM(block) nonce = make([]byte, gcm.NonceSize()) io.ReadFull(rand.Reader, nonce) return gcm.Seal(nil, nonce, plaintext, nil), nonce}
func decryptAESGCM(key, ciphertext, nonce []byte) ([]byte, error) { block, _ := aes.NewCipher(key) gcm, _ := cipher.NewGCM(block) return gcm.Open(nil, nonce, ciphertext, nil)}4. التشفير غير المتماثل RSA
يستخدم RSA