Rust में सुरक्षित प्रमाणीकरण: बैकएंड बनाएं

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

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

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

Rust प्रमाणीकरण के लिए सबसे अच्छा विकल्प क्यों है?

\n\n

यदि आप Rust में वेब एप्लिकेशन लिख रहे हैं, तो आप सुरक्षा के मामले में पहले से ही एक कदम आगे हैं। Rust मेमोरी से जुड़ी गलतियों को माफ नहीं करता, जिसका मतलब है कि कई कमजोरियाँ (बफर ओवरफ्लो, use-after-free) कंपाइलेशन के समय ही खत्म हो जाती हैं। लेकिन कंपाइलर आपको खराब प्रमाणीकरण लॉजिक से नहीं बचाएगा। यही वह विषय है जिस पर हम ध्यान केंद्रित करेंगे - आधुनिक प्रथाओं का उपयोग करके Rust में सुरक्षित प्रमाणीकरण कैसे बनाएं।

\n\n

इस लेख में, हम एक पूर्ण प्रमाणीकरण मॉड्यूल तैयार करेंगे: bcrypt के माध्यम से पासवर्ड हैशिंग, JWT टोकन जारी करना, Actix-web में मिडलवेयर जांच और सामान्य हमलों से सुरक्षा। कोड पूरी तरह से काम करने योग्य होगा - आप इसे अपने प्रोजेक्ट में उपयोग कर सकते हैं।

\n\n

1. पासवर्ड हैशिंग: SHA-256 के बजाय bcrypt क्यों?

\n\n

कई शुरुआती सोचते हैं: "मैं SHA-256 ले लूंगा, यह तेज़ और विश्वसनीय है।" और यह एक घातक गलती है। SHA एक क्रिप्टोग्राफिक हैश फंक्शन है, लेकिन यह बहुत तेज़ है। हमलावर प्रति सेकंड अरबों कॉम्बिनेशन आज़मा सकता है। हमें एक धीमी फंक्शन की आवश्यकता है, जो विशेष रूप से पासवर्ड के लिए डिज़ाइन की गई हो।

\n\n

bcrypt स्वर्ण मानक है। इसमें "सॉल्ट" (salt) और "कॉस्ट फैक्टर" (cost factor) शामिल है, जिसे कंप्यूटिंग पावर बढ़ने पर बढ़ाया जा सकता है।

\n\n

Cargo.toml में bcrypt जोड़ें

\n
[dependencies]\nbcrypt = "0.15"
\n\n

पासवर्ड हैश करें

\n
use bcrypt::{hash, verify, DEFAULT_COST};\n\nfn hash_password(plain: &str) -> Result<String, bcrypt::BcryptError> {\n    hash(plain, DEFAULT_COST) // cost = 12 (डिफ़ॉल्ट)\n}\n\nfn verify_password(plain: &str, hashed: &str) -> bool {\n    verify(plain, hashed).unwrap_or(false)\n}
\n\n

ध्यान दें: verify स्वचालित रूप से हैश से सॉल्ट निकालता है। आपको सॉल्ट को अलग से स्टोर करने की आवश्यकता नहीं है - यह पहले से ही हैश स्ट्रिंग के अंदर है। यह सुरक्षित और सुविधाजनक है।

\n\n

2. JWT टोकन: प्रमाणीकरण में गलती कैसे न करें

\n\n

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

\n\n
    \n
  • सीक्रेट की को कोड में स्टोर न करें। एनवायरनमेंट वेरिएबल का उपयोग करें।
  • \n
  • कम समय सीमा निर्धारित करें। एक्सेस टोकन - 15-30 मिनट, रिफ्रेश टोकन - 7-30 दिन।
  • \n
  • पेलोड में संवेदनशील डेटा न डालें। केवल उपयोगकर्ता ID और भूमिका।
  • \n
\n\n

jsonwebtoken के साथ JWT कार्यान्वयन

\n\n
use jsonwebtoken::{encode, decode, Header, Validation, EncodingKey, DecodingKey};\nuse serde::{Serialize, Deserialize};\nuse chrono::{Utc, Duration};\n\n#[derive(Debug, Serialize, Deserialize)]\npub struct Claims {\n    pub sub: String,       // उपयोगकर्ता ID\n    pub exp: usize,        // समाप्ति टाइमस्टैम्प\n    pub iat: usize,        // जारी करने का समय\n}\n\npub fn create_token(user_id: &str, secret: &str) -> Result<String, jsonwebtoken::errors::Error> {\n    let now = Utc::now();\n    let claims = Claims {\n        sub: user_id.to_owned(),\n        exp: (now + Duration::minutes(30)).timestamp() as usize,\n        iat: now.timestamp() as usize,\n    };\n    encode(&Header::default(), &claims, &EncodingKey::from_secret(secret.as_bytes()))\n}\n\npub fn validate_token(token: &str, secret: &str) -> Result<Claims, jsonwebtoken::errors::Error> {\n    let token_data = decode::<Claims>(\n        token,\n        &DecodingKey::from_secret(secret.as_bytes()),\n        &Validation::default(),\n    )?;\n    Ok(token_data.claims)\n}
\n\n

3. सब कुछ एक साथ जोड़ें: Actix-web + middleware

\n\n

अब हम हैशिंग और JWT को Actix-web पर एक पूर्ण वेब एप्लिकेशन में जोड़ेंगे। हम एक मिडलवेयर लिखेंगे जो प्रत्येक सुरक्षित अनुरोध में टोकन की जांच करेगा।

\n\n

प्रोजेक्ट संरचना

\n
src/\n├── main.rs\n├── auth.rs       # हैशिंग, JWT\n├── middleware.rs # टोकन जांच\n└── handlers.rs   #                

ब्लॉग

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