रिकवर करने योग्य स्टोरेज फॉर्मेट क्या बनाता है
रिकवर करने योग्यता के आधार पर चार स्टोरेज फॉर्मेट्स:
| फॉर्मेट | रिकवर करने योग्य? | उदाहरण | रिकवरी विधि |
|---|---|---|---|
| प्लेनटेक्स्ट | हाँ | password: hunter2 | फ़ाइल पढ़ें |
| Base64 | हाँ | cGFzc3dvcmQ= | base64 --decode |
| Reversible cipher (AES) | हाँ | ENC[AES256:...] | कुंजी से डिक्रिप्ट करें |
| One-way hash (bcrypt) | नहीं | $2b$12$... | उल्टा नहीं किया जा सकता; ब्रूट-फोर्स करना होगा |
Plaintext, base64, और reversible cipher: सभी recoverable हैं। एक credential database dump हमलावर को सभी उपयोगकर्ताओं के पासवर्ड एक साथ cleartext में दे देता है। एक breach; कुल exposure.
The Mailman 2.x Example
Mailman 2.x (GNU mailing list manager): subscriber passwords को plaintext में store करता था। Monthly password reminder email: सभी subscribers को उनका password cleartext में भेजता था। दो अलग-अलग defects, दोनों MOAD-0006:
1. Storage: list database में plaintext। Server compromise सभी subscriber passwords को expose कर देता है।
2. Broadcast: monthly email plaintext password को SMTP के माध्यम से subscriber के email server तक भेजता है। Email कई SMTP hops के बीच cleartext में यात्रा करता है।
Mailman टीम ने दोनों व्यवहार डिज़ाइन किए। रिकवरी फीचर थी: सब्सक्राइबर्स भूले हुए पासवर्ड पुनः प्राप्त कर सकते थे। Glass Safe नाम इसी से आया: safe क्रेडेंशियल्स को दृश्य रूप में रखता है। जो कोई भी safe तक पहुँचता है, वह सभी सामग्री एक साथ पढ़ सकता है।
The Already-Stolen Principle
रिकवरेबल फॉर्म में संग्रहीत क्रेडेंशियल पहले से ही चोरी हो चुका क्रेडेंशियल है। हमलावर अभी नहीं पहुँचा है। उल्लंघन अभी नहीं हुआ है। लेकिन आर्किटेक्चर गारंटी देता है: जब उल्लंघन होता है, तो सभी क्रेडेंशियल एक साथ गिर जाते हैं। कोई उल्लंघन अलग-थलग नहीं होता; रिकवरेबल स्टोरेज में मौजूद हर क्रेडेंशियल एक ही ऑपरेशन में हमलावर को ट्रांसफर हो जाता है।
MOAD-0006 vs MOAD-0004
MOAD-0004 (Logged Secret): क्रेडेंशियल्स गलती से लॉग्स में लिखे गए। लॉग लिखना इरादा नहीं था; यह डीबगिंग के लिए हेडर लॉगिंग सक्षम करने का साइड इफेक्ट था।
MOAD-0006 (Glass Safe): क्रेडेंशियल्स डिज़ाइन के अनुसार रिकवरेबल फॉर्म में संग्रहीत किए गए। रिकवरी इरादा था। पासवर्ड रिमाइंडर फीचर के लिए पासवर्ड स्टोर करना आवश्यक था। डिस्प्ले-पासवर्ड फीचर के लिए इसे स्टोर करना आवश्यक था। रिकवरी के लिए आर्किटेक्चरल प्रतिबद्धता ने दोष पैदा किया।
एक-पंक्ति अंतर: MOAD-0004 क्रेडेंशियल्स को गलती से लॉग्स में डालता है; MOAD-0006 क्रेडेंशियल्स को जानबूझकर रिकवरेबल फॉर्म में स्टोर करता है। फिक्स अलग-अलग लेयर्स पर काम करते हैं।
Structural vs Accidental
MOAD-0006 और MOAD-0004 के बीच का आर्किटेक्चरल अंतर फिक्स स्ट्रैटेजी तय करता है। एक आकस्मिक लॉग राइट: सीरियलाइज़ेशन लेयर को ठीक करें। एक रिकवरी के लिए डिज़ाइन किया गया स्टोरेज: उस फीचर को रीडिज़ाइन करें जिसके लिए रिकवरी की ज़रूरत थी।
Why bcrypt Works
एक वन-वे हैश फंक्शन पासवर्ड स्वीकार करता है और एक निश्चित-लंबाई डाइजेस्ट उत्पन्न करता है। डाइजेस्ट दिए जाने पर, मूल पासवर्ड को रिकवर नहीं किया जा सकता। 'रिकवर करना मुश्किल': रिवर्स करना असंभव। फंक्शन केवल एक दिशा में चलता है।
क्रेडेंशियल स्टोरेज के लिए तीन आवश्यक गुण:
1. एक-तरफ़ा (preimage resistance). hash(password) दिए जाने पर, कोई भी एल्गोरिदम password को brute-force से तेज़ी से पुनर्प्राप्त नहीं कर सकता। bcrypt, scrypt, और argon2 सभी इस गुण को पूरा करते हैं।
2. Salt. पासवर्ड को हैश करने से पहले उसके आगे जोड़ा गया एक रैंडम मान। एक ही पासवर्ड, अलग salt, अलग हैश। उद्देश्य: rainbow tables (पूर्व-गणना किए गए हैश शब्दकोश) को निष्क्रिय करना। बिना salt के: एक हमलावर hash('password123') की गणना एक बार करता है और 1 मिलियन उपयोगकर्ताओं की जांच एक साथ करता है। salt के साथ: एक ही पासवर्ड के लिए भी प्रत्येक उपयोगकर्ता का हैश अद्वितीय होता है।
3. डिज़ाइन द्वारा धीमा। bcrypt एक work factor स्वीकार करता है। उच्च work factor: अधिक iterations, प्रति हैश प्रयास में अधिक गणना समय। लॉगिन: एक बार हैश करने में 300ms। स्वीकार्य। brute-force: प्रति प्रयास 300ms। 1 अरब प्रयासों पर: प्रति पासवर्ड 9.5 वर्ष। हमलावर के लिए अस्वीकार्य। धीमापन: एक दोष नहीं, बल्कि एक विशेषता।
import bcrypt
# स्टोर: salt के साथ एक-तरफ़ा हैश
def store_password(plaintext: str) -> bytes:
return bcrypt.hashpw(plaintext.encode(), bcrypt.gensalt(rounds=12))
# Verify: hash the candidate & compare digests
def verify_password(plaintext: str, stored_hash: bytes) -> bool:
return bcrypt.checkpw(plaintext.encode(), stored_hash)
# NEVER stored: the plaintext password
# कभी रिकवर नहीं किया जा सकता: हैश से प्लेनटेक्स्ट
# पासवर्ड रीसेट, पासवर्ड रिमाइंडर नहीं
ट्रेडऑफ
वन-वे हैशिंग पासवर्ड रिकवरी को असंभव बना देता है। जो उपयोगकर्ता अपना पासवर्ड भूल जाता है, उसे वापस नहीं मिल सकता। पासवर्ड रिमाइंडर ईमेल मौजूद नहीं हो सकता। उपयोगकर्ता अनुभव बदल जाता है: 'पासवर्ड भूल गए? रीसेट करें।' यह कोई गिरावट नहीं, बल्कि एक सुरक्षा सीमा है। वह सिस्टम जो पासवर्ड रिकवर नहीं कर सकता, पासवर्ड लीक भी नहीं कर सकता।
bcrypt हैश उजागर करने वाले डेटाबेस उल्लंघन में: सभी हैश दिखाई देते हैं, कोई पासवर्ड दिखाई नहीं देता। हमलावर को प्रत्येक हैश को व्यक्तिगत रूप से ब्रूट-फोर्स करना पड़ता है, प्रति प्रयास 300ms, प्रति-उपयोगकर्ता सॉल्ट प्रीकंप्यूटेड टेबल्स को विफल कर देता है। प्लेनटेक्स्ट पासवर्ड उजागर करने वाले उल्लंघन में: पूर्ण तत्काल एक्सपोजर।
मजबूत एन्क्रिप्शन पर्याप्त नहीं है
एक सुरक्षा ऑडिट एक क्रेडेंशियल स्टोरेज सिस्टम की पहचान करता है। पासवर्ड AES-256-CBC एन्क्रिप्शन का उपयोग करके सर्वर-साइड कुंजी के साथ संग्रहीत किए जाते हैं। ऑडिट रिपोर्ट इसे Glass Safe दोष के रूप में चिह्नित करती है।
इंजीनियरिंग टीम जवाब देती है: 'AES-256 सबसे मजबूत सममित सिफर उपलब्ध है। कुंजी एक हार्डवेयर सुरक्षा मॉड्यूल में रहती है। कोई हमलावर इन पासवर्ड्स को डिक्रिप्ट नहीं कर सकता।'