/ / सुरक्षित रूप से उत्पन्न एन्क्रिप्शन कुंजी उपयोगकर्ता के पासवर्ड से? - django, सुरक्षा, एन्क्रिप्शन, हैश, क्रिप्टोग्राफी

उपयोगकर्ता के पासवर्ड से सुरक्षित रूप से जेनरेट की गई एन्क्रिप्शन कुंजी? - django, सुरक्षा, एन्क्रिप्शन, हैश, क्रिप्टोग्राफी

मैं MySQL के साथ एक Django वेबसाइट का निर्माण कर रहा हूँ। मैंने पहले से ही उपयोगकर्ता के पासवर्ड को संग्रहीत करने के लिए यादृच्छिक रूप से उत्पन्न नमक हैश के साथ pbkdf2-sha256 में निर्मित Django का उपयोग करने का निर्णय लिया है।

हालांकि इस वेबसाइट को स्टोर करने की भी आवश्यकता होगीकई अन्य वेबसाइटों के लिए तृतीय पक्ष लॉगिन क्रेडेंशियल (जो "ओ यूथ का उपयोग नहीं करते हैं)। इसलिए मैं एईएस -256 एन्क्रिप्शन में देख रहा था और निश्चित रूप से मुद्दा यह हो जाता है कि एन्क्रिप्शन कुंजी को सुरक्षित रूप से कहाँ संग्रहीत किया जाए।

अब यहाँ मेरा समाधान है: प्रत्येक एन्क्रिप्शन कुंजी = उपयोगकर्ताओं के हैश को वास्तविक पासवर्ड और बेतरतीब ढंग से उत्पन्न नमक (अलग से जमा किए गए पासवर्ड के लिए पहले से इस्तेमाल किए गए नमक से अलग) दें। नमक को टेबल में रखा जाएगा, वास्तविक पासवर्ड और इसका हैश स्पष्ट रूप से नहीं। तो एन्क्रिप्शन कुंजी लॉगिन पर उत्पन्न होगी और अस्थायी रूप से संग्रहीत की जाएगी लेकिन लॉगआउट पर समाप्त हो जाएगी। इसके अलावा सर्वर से छेड़छाड़ करने वाला कोई व्यक्ति मूल pbkdf2-sha256 हैश को क्रैक किए बिना एन्क्रिप्शन कुंजी उत्पन्न नहीं कर सकता है और तब भी, यह केवल उसी उपयोगकर्ता के लिए होगा, सार्वभौमिक कुंजी नहीं।

नकारात्मक पक्ष यह है कि यदि वे बदलते हैं / रीसेट करते हैंपासवर्ड, उन्हें प्रत्येक साइट के लिए अपनी साख फिर से दर्ज करनी होगी। लेकिन यह बहुत बड़ी बात नहीं है और ऐसा लगता है कि सर्वर या कहीं अलग सर्वर पर कुंजी जमा करने से ज्यादा सुरक्षित है।

लेकिन मैंने केवल यही सीखा है कि 24 घंटे पहले एक हैश क्या होता है इसलिए मुझे क्या पता है। क्या मैं कुछ देख रहा हूँ या यह यथोचित सुरक्षित है? या कोई बेहतर तरीका है?

उत्तर:

जवाब के लिए 3 № 1

एल्गोरिथ्म PBKDF2 जिसका उल्लेख आप वास्तव में इस स्पष्ट उद्देश्य के लिए किया गया है।

तो, वर्कफ़्लो एक यादृच्छिक नमक उत्पन्न करने के लिए होगा। फिर उपयोगकर्ता के लिए डेटाबेस में संग्रहीत करें।

एक उच्च पुनरावृत्ति गिनती और नमक के साथ PBKDF2 का उपयोग करते हुए, कुंजी सामग्री (80 बाइट्स) के 640 बिट्स उत्पन्न करते हैं।

पहले 128 बिट्स सिफर के लिए IV बन जाते हैं

अगले 256 बिट्स सिफर कुंजी (AES-256 के लिए उपयोग की जाने वाली कुंजी) बन जाते हैं

अंतिम 256 बिट्स मैक कुंजी बन जाती है (एन्क्रिप्शन को प्रमाणित करने के लिए उपयोग की जाने वाली कुंजी)।

key = PBKDF2-SHA256(password, salt, 50000, 80)
iv = key[0:128]
cipherKey = key[128:384]
macKey = key[384:640]

फिर, उन कुंजियों (छद्म-कोड) का उपयोग करके डेटा एन्क्रिप्ट करें:

ciphertext = AES-256-CBC(data, cipherKey, iv)
authtext = SHA256-HMAC(ciphertext, macKey)
result = "{}{}".format(authtext, ciphertext)

अब डिक्रिप्शन पर, रिवर्स में वापस चलें ...

key = PBKDF2-SHA256(password, salt, 50000, 80)
iv = key[0:128]
cipherKey = key[128:384]
macKey = key[384:640]

authtext = result[0:32]
ciphertext = result[32:]

if !timingSafeComparison(authtext, SHA256-HMAC(ciphertext, macKey)):
return false

return AES-256-CBC-DECRYPT(ciphertext, cipherKey, iv)

हां, यदि आपका उपयोगकर्ता पासवर्ड भूल जाता है, तो सभी एन्क्रिप्टेड डेटा चला गया है। लेकिन यह है कि आप क्या चाहते हैं, है ना?