परिचय: आपका पासवर्ड सिर्फ एक स्ट्रिंग क्यों नहीं है
\n\nकल्पना करें: आपने ऑनलाइन लाइब्रेरी के लिए एक शानदार Java एप्लिकेशन लिखा। उपयोगकर्ता पंजीकरण करते हैं, बुकमार्क सहेजते हैं, समीक्षाएँ लिखते हैं। और अचानक — डेटाबेस लीक। सभी पासवर्ड खुले रूप में। आपदा? बिल्कुल! 2024 में, डेटा लीक हर 39 सेकंड में होता है, और उनमें से 81% कमजोर प्रमाणीकरण से संबंधित हैं। यदि आप Java में लिखते हैं और चाहते हैं कि आपका प्रोजेक्ट साइबर समाचारों में न आए — यह लेख आपके लिए है।
\n\nहम Java अनुप्रयोगों में सुरक्षित प्रमाणीकरण को A से Z तक कवर करेंगे: पासवर्ड हैशिंग से लेकर JWT और CSRF से सुरक्षा तक। कोई उबाऊ सिद्धांत नहीं, केवल काम करने वाला कोड और वास्तविक अभ्यास। चलिए शुरू करते हैं!
\n\n1. पासवर्ड हैशिंग: रक्षा की पहली पंक्ति
\n\nसुरक्षा का पहला नियम: पासवर्ड को कभी भी खुले रूप में स्टोर न करें। भले ही आपका डेटाबेस पवित्र ग्रिल हो, पासवर्ड एन्क्रिप्शन न्यूनतम आवश्यकता है। Java में इसके लिए bcrypt, scrypt या Argon2 जैसे एल्गोरिदम का उपयोग किया जाता है। MD5 या SHA क्यों नहीं? क्योंकि वे बहुत तेज़ हैं — हमलावर सेकंडों में पासवर्ड का अनुमान लगा लेगा।
\n\nअभ्यास: bcrypt क्रियान्वयन
\npom.xml (Maven) में निर्भरता जोड़ें:
<dependency>\n <groupId>org.springframework.security</groupId>\n <artifactId>spring-security-crypto</artifactId>\n <version>6.2.0</version>\n</dependency>\n\n\nअब पंजीकरण के समय पासवर्ड हैश करें:
\nimport org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;\n\npublic class PasswordService {\n private final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();\n\n public String hashPassword(String rawPassword) {\n return encoder.encode(rawPassword); // स्वचालित रूप से सॉल्ट उत्पन्न करता है\n }\n\n public boolean checkPassword(String rawPassword, String storedHash) {\n return encoder.matches(rawPassword, storedHash);\n }\n}\n\n\nमहत्वपूर्ण: bcrypt स्वयं यादृच्छिक सॉल्ट जोड़ता है, इसलिए समान पासवर्ड भी अलग दिखेंगे। डिफ़ॉल्ट लागत (cost factor) 10 है, लेकिन महत्वपूर्ण सिस्टम के लिए इसे 12-14 तक बढ़ाया जा सकता है।
\n\n2. JWT (JSON Web Tokens): हल्का और सुरक्षित सत्र
\n\nपंजीकरण के बाद, उपयोगकर्ता को अपनी पहचान साबित करने का कोई तरीका चाहिए। कुकीज़? संभव है, लेकिन JWT REST API के लिए आधुनिक मानक है। टोकन में उपयोगकर्ता के बारे में जानकारी होती है और यह गुप्त कुंजी से हस्ताक्षरित होता है। सर्वर पर कोई सत्र नहीं — सब कुछ टोकन में।
\n\nJava में JWT बनाना
\nलाइब्रेरी io.jsonwebtoken:jjwt कनेक्ट करें:
<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-api</artifactId>\n <version>0.12.3</version>\n</dependency>\n\n\nटोकन जनरेशन:
\nimport io.jsonwebtoken.Jwts;\nimport io.jsonwebtoken.security.Keys;\nimport javax.crypto.SecretKey;\nimport java.util.Date;\n\npublic class JwtUtil {\n private final SecretKey key = Keys.hmacShaKeyFor("गुप्त_कुंजी_कम_से_कम_256_बिट_लंबी".getBytes());\n\n public String generateToken(String username) {\n return Jwts.builder()\n .subject(username)\n .issuedAt(new Date())\n .expiration(new Date(System.currentTimeMillis() + 3600000)) // 1 घंटा\n .signWith(key)\n .compact();\n }\n\n public String extractUsername(String token) {\n return Jwts.parser()\n .verifyWith(key)\n .build()\n .parseSignedClaims(token)\n .getPayload()\n .getSubject();\n }\n}\n\n\nसुझाव: गुप्त कुंजी को कोड में न रखें! पर्यावरण चर या Vault का उपयोग करें। और JWT में कभी भी संवेदनशील डेटा (पासवर्ड, कार्ड नंबर) न डालें — टोकन को हस्ताक्षर के बिना डीकोड किया जा सकता है।
\n\n