التشفير في Go (Golang): التشفير والتجزئة
Go (Golang) هي لغة مترجمة حديثة تشتهر بأدائها ودعمها المدمج لخوارزميات التشفير. توفر المكتبة القياسية crypto كل ما هو ضروري لحماية البيانات: من التجزئة البسيطة إلى التشفير غير المتماثل المعقد. في هذه المقالة، سنستعرض الأدوات الرئيسية ونقدم أمثلة عملية على الكود.
لماذا نحتاج التشفير في Go؟
يُستخدم التشفير في Go من أجل:
- تخزين كلمات المرور (التجزئة);
- نقل البيانات عبر الشبكة (TLS/SSL);
- التوقيعات الرقمية والمصادقة;
- تشفير الملفات السرية.
تضمن Go الأمان من خلال واجهة برمجة تطبيقات (API) مدروسة جيدًا - من الصعب استخدام خوارزمية قديمة أو غير آمنة عن طريق الخطأ.
التجزئة في Go
التجزئة هي تحويل البيانات في اتجاه واحد إلى سلسلة ذات طول ثابت. في Go، تتولى الحزم crypto/md5 و crypto/sha1 و crypto/sha256 و crypto/sha512 هذه المهمة.
مثال: تجزئة SHA-256
package main
import ( "crypto/sha256" "fmt")
func main() { data := []byte("بيانات سرية") hash := sha256.Sum256(data) fmt.Printf("SHA256: %x", hash)}المخرجات: SHA256: 3c3b... (64 حرفًا)
التجزئة مع الملح (Salt) لكلمات المرور
لتخزين كلمات المرور بشكل آمن، استخدم crypto/rand لتوليد الملح و crypto/sha256:
package main
import ( "crypto/rand" "crypto/sha256" "fmt")
func main() { password := []byte("كلمةالمرور123") salt := make([]byte, 16) rand.Read(salt) salted := append(salt, password...) hash := sha256.Sum256(salted) fmt.Printf("الملح: %x", salt) fmt.Printf("التجزئة: %x", hash)}من الناحية العملية، من الأفضل استخدام bcrypt (الحزمة golang.org/x/crypto/bcrypt) لكلمات المرور، لكن SHA-256 مع الملح يعد خيارًا جيدًا للتعلم.
التشفير المتماثل: AES
AES (معيار التشفير المتقدم) هو أشهر خوارزمية تشفير متماثل. في Go، يتم تنفيذه في الحزمة crypto/aes بالاقتران مع أوضاع التشفير (crypto/cipher).
مثال: تشفير AES-GCM
package main
import ( "crypto/aes" "crypto/cipher" "crypto/rand" "fmt")
func main() { key := []byte("0123456789abcdef0123456789abcdef") // 32 بايت لـ AES-256 plaintext := []byte("رسالة سرية") block, _ := aes.NewCipher(key) aead, _ := cipher.NewGCM(block) nonce := make([]byte, aead.NonceSize()) rand.Read(nonce) ciphertext := aead.Seal(nil, nonce, plaintext, nil) fmt.Printf("مشفر: %x", ciphertext) // فك التشفير decrypted, _ := aead.Open(nil, nonce, ciphertext, nil) fmt.Printf("مفكوك التشفير: %s", decrypted)}يوفر وضع GCM (Galois/Counter Mode) السرية والمصادقة - وهو الخيار الأفضل لمعظم المهام.
التشفير غير المتماثل: RSA
يستخدم RSA زوجًا من المفاتيح (عام وخاص). في Go، يتم تنفيذه في crypto/rsa و crypto/rand.
توليد المفاتيح والتشفير
package main
import ( "crypto/rand" "crypto/rsa" "crypto/sha256" "fmt")
func main() { privateKey, _ := rsa.GenerateKey(rand.Reader, 2048) publicKey := &privateKey.PublicKey message := []byte("سر لـ RSA") label := []byte("") // التشفير بالمفتاح العام ciphertext, _ := rsa.EncryptOAEP(sha256.New(), rand.Reader, publicKey, message, label) fmt.Printf("مشفر بـ RSA: %x", ciphertext) // فك التشفير بالمفتاح الخاص plaintext, _ := rsa.DecryptOAEP(sha