एक चीज़ जो मैंने यहाँ नहीं देखी है, हालाँकि यह माक्र्स एडम्स के उत्तर का विस्तार है, यह है कि आपको किसी उपयोगकर्ता की पहचान करने और प्रमाणित करने के लिए सूचना के एक टुकड़े का उपयोग नहीं करना चाहिए, अगर समय पर हमले की संभावना है , जो हो सकता है एक स्ट्रिंग तुलना में कितनी दूर है, इसका अनुमान लगाने के लिए प्रतिक्रिया समय के अंतर का उपयोग करें।
यदि आप एक ऐसी प्रणाली का उपयोग कर रहे हैं जो उपयोगकर्ता या क्रेडेंशियल को देखने के लिए "कुंजी" का उपयोग करता है, तो जानकारी के टुकड़े को समय के साथ हजारों अनुरोध भेजकर और आपके डेटाबेस को खोजने के लिए (या नहीं) समय की जांच करके समय का अनुमान लगाया जा सकता है। खोज) एक रिकॉर्ड। यह विशेष रूप से सच है अगर कुंजी के एक-तरफ़ा हैश के बजाय "कुंजी" को प्लेनटेक्स्ट में संग्रहीत किया जाता है। यदि आप फिर से उपयोगकर्ता को कुंजी प्रदर्शित करने में सक्षम होना चाहते हैं, तो आप उपयोगकर्ताओं की कुंजियों को प्लेनटेक्स्ट या सममित रूप से एन्क्रिप्टेड में संग्रहीत करना चाहेंगे।
जानकारी का एक दूसरा टुकड़ा, या "गुप्त" होने से, आप पहले "कुंजी" का उपयोग करके उपयोगकर्ता या क्रेडेंशियल को देख सकते हैं, जो किसी समय के हमले के लिए असुरक्षित हो सकता है, फिर समय-सुरक्षित तुलना फ़ंक्शन का उपयोग करके मान का मान जांचें रहस्य"।
यहाँ पायथन के उस कार्य को लागू करना है:
https://github.com/python/cpython/blob/cd8295ff758891f21084a6a5ad3403d35dda38f7/Modules/_operator.c#L727
और यह परिवाद में उजागर किया गया है hmac
(और शायद अन्य):
https://docs.python.org/3/library/hmac.html#hmac.compare_digest
यहां एक बात ध्यान देने वाली है कि मुझे नहीं लगता कि इस तरह का हमला उन मूल्यों पर काम करेगा जो देखने से पहले हैशेड या एन्क्रिप्ट किए गए हैं, क्योंकि जिन मूल्यों की तुलना की जा रही है, उनमें हर बार इनपुट स्ट्रिंग परिवर्तनों में एक चरित्र के बेतरतीब ढंग से बदलाव होते हैं। मुझे यहाँ इसकी अच्छी व्याख्या मिली ।
तब एपीआई कुंजियाँ संग्रहीत करने के लिए समाधान होंगे:
- एक अलग कुंजी और रहस्य का उपयोग करें, रिकॉर्ड देखने के लिए कुंजी का उपयोग करें, और गुप्त की जांच करने के लिए एक समय-सुरक्षित तुलना का उपयोग करें। यह आपको उपयोगकर्ता को फिर से एक उपयोगकर्ता को कुंजी और रहस्य दिखाने की अनुमति देता है।
- एक अलग कुंजी और रहस्य का उपयोग करें, गुप्त पर सममित, नियतात्मक एन्क्रिप्शन का उपयोग करें, और एन्क्रिप्टेड रहस्यों की एक सामान्य तुलना करें। यह आपको उपयोगकर्ता को फिर से कुंजी और गुप्त दिखाने की अनुमति देता है, और आपको समय-सुरक्षित तुलना को लागू करने से बचा सकता है।
- एक अलग कुंजी और रहस्य का उपयोग करें, रहस्य प्रदर्शित करें, हैश करें और इसे स्टोर करें, फिर हैशेड रहस्य की एक सामान्य तुलना करें। यह दो-तरफ़ा एन्क्रिप्शन का उपयोग करने की आवश्यकता को हटाता है, और सिस्टम से समझौता होने पर अपने गुप्त को सुरक्षित रखने का अतिरिक्त लाभ है। इसका नकारात्मक पक्ष यह है कि आप उपयोगकर्ता को फिर से रहस्य नहीं दिखा सकते हैं।
- एकल कुंजी का उपयोग करें , इसे उपयोगकर्ता को एक बार दिखाएं, हैश करें, फिर हैशेड या एन्क्रिप्ट की गई कुंजी की सामान्य खोज करें। यह एक कुंजी का उपयोग करता है, लेकिन यह फिर से उपयोगकर्ता को दिखाने में सक्षम नहीं है। यदि सिस्टम से छेड़छाड़ की जाती है, तो कुंजी को सुरक्षित रखने का लाभ है।
- एकल कुंजी का उपयोग करें , इसे एक बार उपयोगकर्ता को दिखाएं, इसे एन्क्रिप्ट करें, और एन्क्रिप्ट किए गए रहस्य की सामान्य खोज करें। उपयोगकर्ता को फिर से दिखाया जा सकता है, लेकिन अगर वे सिस्टम से समझौता करते हैं, तो चाबियाँ कमजोर होने की कीमत पर।
इनमें से, मुझे लगता है कि 3 सुरक्षा और सुविधा का सबसे अच्छा संतुलन है। मैंने इसे कई वेबसाइटों पर लागू किया है जब कुंजियाँ जारी की जा रही हैं।
इसके अलावा, मैं किसी भी वास्तविक सुरक्षा विशेषज्ञों को इस उत्तर की आलोचना करने के लिए आमंत्रित करता हूं। मैं बस इसे एक और चर्चा बिंदु के रूप में बाहर निकालना चाहता था।