Go में सुरक्षित प्रमाणीकरण: बिना कमजोरियों के कोड लिखना

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Go में प्रमाणीकरण कोई मज़ाक क्यों नहीं है?

\n\n

Go एक ऐसी भाषा है जिसे गति और विश्वसनीयता के लिए चुना जाता है। लेकिन सबसे तेज़ सर्वर भी कद्दू में बदल जाता है अगर उसके माध्यम से पासवर्ड चुराए जा सकते हैं। Go एप्लिकेशन में सुरक्षित प्रमाणीकरण सिर्फ "लाइब्रेरी लगाई और भूल गए" नहीं है। यह एक पूरा विज्ञान है: पासवर्ड कैसे स्टोर करें, JWT को कैसे विफल न करें, CSRF से कैसे बचाव करें जब सब कुछ जल रहा हो।

\n\n

इस लेख में हम सिद्धांत पर व्याख्यान नहीं देंगे। हम कोड लिखेंगे। वास्तविक, काम करने वाला कोड जिसे आप सीधे अपने प्रोजेक्ट में डाल सकते हैं। हम सुरक्षा के तीन स्तंभों पर चर्चा करेंगे: पासवर्ड हैशिंग (bcrypt), JWT टोकन के साथ काम करना और क्रॉस-साइट रिक्वेस्ट फोर्जरी (CSRF) से सुरक्षा।

\n\n

पासवर्ड को सही तरीके से हैश करें: md5 बुराई क्यों है

\n\n

सुरक्षा की ओर पहला कदम - कभी नहीं, सुनें, कभी नहीं पासवर्ड को सादे टेक्स्ट में स्टोर करें। भले ही आप अपने डेटाबेस पर भरोसा करते हों। हैक किसी के भी साथ हो सकता है (Yahoo या Adobe से पूछें)। सही हैशिंग आपकी ढाल है।

\n\n

Go में मानक विकल्प golang.org/x/crypto/bcrypt है। bcrypt क्यों? यह ब्रूट-फोर्स हमलों के लिए प्रतिरोधी है (इसमें "सॉल्ट" शामिल है और गणना को धीमा करता है)। MD5 या SHA-1 माइक्रोसेकंड में गणना की जाती हैं। Bcrypt - सैकड़ों मिलीसेकंड में। हमलावर के लिए यह आपदा है, उपयोगकर्ता के लिए अदृश्य।

\n\n

उदाहरण: उपयोगकर्ता पंजीकरण

\n\n
package main\n\nimport (\n    "fmt"\n    "golang.org/x/crypto/bcrypt"\n)\n\nfunc hashPassword(password string) (string, error) {\n    bytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)\n    return string(bytes), err\n}\n\nfunc checkPasswordHash(password, hash string) bool {\n    err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))\n    return err == nil\n}\n\nfunc main() {\n    password := "mySecretPass123"\n    hash, _ := hashPassword(password)\n\n    fmt.Println("पासवर्ड:", password)\n    fmt.Println("हैश:  ", hash)\n\n    match := checkPasswordHash(password, hash)\n    fmt.Println("मेल खाता है:", match)\n}
\n\n

ध्यान दें: bcrypt.DefaultCost 10 पुनरावृत्तियाँ हैं। प्रोडक्शन के लिए इसे 12-14 तक बढ़ाया जा सकता है, लेकिन इसे ज़्यादा न करें, अन्यथा सर्वर लोड के तहत ढह जाएगा। अपने हार्डवेयर पर परीक्षण करें।

\n\n

लॉगिन पर पासवर्ड जांच

\n\n

यह सरल है: फॉर्म से पासवर्ड लें, डेटाबेस से हैश लें, bcrypt.CompareHashAndPassword के माध्यम से तुलना करें। अगर यह nil लौटाता है - उपयोगकर्ता सही है। अगर त्रुटि है - 401 भेजें।

\n\n
func loginHandler(w http.ResponseWriter, r *http.Request) {\n    // फॉर्म से पासवर्ड प्राप्त करें\n    storedHash := getUserHashFromDB(r.FormValue("email"))\n    if !checkPasswordHash(r.FormValue("password"), storedHash) {\n        http.Error(w, "गलत पासवर्ड", http.StatusUnauthorized)\n        return\n    }\n    // सत्र या टोकन बनाएँ\n}
\n\n

JWT: एक चाल के साथ हल्का प्रमाणीकरण

\n\n

पासवर्ड दर्ज करने के बाद, उपयोगकर्ता को एक "पास" जारी करने की आवश्यकता होती है। लोकप्रिय तरीकों में से एक JWT (JSON Web Token) है। यह एक कॉम्पैक्ट टोकन है जिसमें उपयोगकर्ता डेटा और हस्ताक्षर होता है। लेकिन शैतान विवरण में है: JWT का गलत कार्यान्वयन आपके एप्लिकेशन को कमजोर बना सकता है।

\n\n

Go में सही JWT जनरेशन

\n\n

लाइब्रेरी github.com/golang-jwt/jwt/v5 का उपयोग करें। क्रिप्टोग्राफी के लिए कभी भी अपना खुद का पहिया न बनाएं - केवल सिद्ध लाइब्रेरी का उपयोग करें।

\n\n
import (\n    "time"\n    "github.com/golang-jwt/jwt/v5"\n)\n\nvar jwtKey = []byte("my_secret_key_which_must_be_long_and_random")\n\ntype Claims struct {\n    Username string `json:"username"`\n    jwt.RegisteredClaims\n}\n\nfunc generateToken(username string) (string, error) {\n    expirationTime := time.Now().Add(15 * time.Minute)\n    claims := &Claims{\n        Username: username,\n        RegisteredClaims: jwt.RegisteredClaims{\n            ExpiresAt: jwt.NewNumericDate(expirationTime),\n        },\n    }\n\n    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)\n    return token.SignedS                

ब्लॉग

पुस्तक अनुशंसाएँ