क्यों इतने सारे हैशेड और एन्क्रिप्टेड स्ट्रिंग्स एक समान चिह्न में समाप्त होते हैं?


64

मैं C # और MSSQL में काम करता हूं और जैसा कि आप अपेक्षा करते हैं कि मैं अपने पासवर्ड नमकीन और हैशेड स्टोर करूंगा।

जब मैं एक nvarchar स्तंभ में संग्रहीत हैश को देखता हूं (उदाहरण के लिए बॉक्स एस्पनेट सदस्यता प्रदाता)। मैं हमेशा उत्सुक रहा हूं कि उत्पन्न साल्ट और हैश मान हमेशा एक या दो बराबर संकेतों में समाप्त होते हैं।

मैंने एन्क्रिप्शन एल्गोरिदम के साथ काम करते समय समान चीजों को देखा है, क्या यह संयोग है या इसका कोई कारण है?


19
एक तरफ के रूप में, यदि आप एक NVARCHAR क्षेत्र में Base64- एन्कोडेड बाइनरी डेटा स्टोर कर रहे हैं, तो मैं आपके 6,000 स्टोरेज कचरे के लिए रोता हूं! एक के लिए, Base64 में ASCII के निचले आधे भाग में केवल 64 अक्षर हो सकते हैं (इसलिए आपको केवल आधे को बचाने के लिए VARCHAR की आवश्यकता है)। दो के लिए, बेस 64 डेटा के प्रत्येक बाइट को 1-4 वर्णों में विस्फोट करता है। SQL सर्वर में पहले से ही एक VARBINARY प्रकार है जो एन्कोडिंग से ब्लोट के बिना आपके हैश को स्टोर करने में काफी सक्षम है, और इसकी तुलना में
टकराव की

3
@WillieWheeler, हैश को किसी तरह संग्रहीत किया जाना है। बेस 64 सही भंडारण माध्यम नहीं हो सकता है, लेकिन इसमें कुछ भी गलत नहीं है। यदि hash("my password")ऐरे का उत्पादन करता है [1,2,3,4,5]और मुझे उन मूल्यों को डेटाबेस में संग्रहीत करने AQIDBAU=की आवश्यकता है, तो स्ट्रिंग को स्टोर करने से भी बदतर विकल्प हैं (बेशक, यदि उपयोग में हैश फ़ंक्शन पहले से ही एक स्ट्रिंग का उत्पादन कर रहा है, तो यह थोड़ा सा मूर्खतापूर्ण लगता है तब Base64 इसे एनकोड करता है। )
ब्रायन एस

2
@WillieWheeler मुझे लगता है कि आप इस बिंदु को याद कर रहे हैं। ब्रायन एस ने जो लिखा उसे फिर से पढ़ें - वह हैशिंग के लिए बेस 64 के गुणों के बारे में बात नहीं कर रहा था - जो कि बेतुका होगा, बेस 64 एक हैशिंग एल्गोरिथ्म नहीं है। वह कह रहा है कि बेस 64 फॉर्म में हैश (हैश फंक्शन / एल्गोरिदम द्वारा निर्मित) को स्टोर करने में कुछ भी गलत नहीं है।
एंड्रयू सविनाख

3
ओपी का कहना है कि वह हैश को संग्रहीत करता है और यह समान संकेतों के साथ समाप्त होता है। यह बताता है कि वह बेसिंग एन्कोडिंग के साथ हैशिंग को भ्रमित कर रहा है। अगर मुद्दा यह है कि यह ठीक है, तो base64 एक हैश को एनकोड करता है, तो बेशक, लेकिन इसका किसी भी चीज से क्या लेना-देना है?
विली व्हीलर

2
हाँ, मुझे अंततः एहसास हुआ कि क्या चल रहा है। मैंने अपनी SSH सार्वजनिक और निजी कुंजी फ़ाइलों में देखा और देखा कि उनके पास भी = / == अंत है। ये बाइट सरणियों के बेस64 एनकोडिंग हैं, जैसे ब्रायन और ज़ाप्री का वर्णन है। धन्यवाद दोस्तों।
विली व्हीलर

जवाबों:


95

ये हैशेड स्ट्रिंग हैं (आमतौर पर?) को बेस 64 प्रारूप में कोडित किया गया है और तीन की लंबाई (बाइट्स की संख्या) को विभाज्य बनाने के लिए स्ट्रिंग को पैडिंग के लिए बराबर चिह्न का उपयोग किया जाता है। विकिपीडिया यह बहुत अच्छी तरह से बताते हैं: http://en.wikipedia.org/wiki/Base64


36

यह बेस 64 एन्कोडिंग पैडिंग हो सकता है?

'==' अनुक्रम इंगित करता है कि अंतिम समूह में केवल एक बाइट शामिल है, और '=' इंगित करता है कि इसमें दो बाइट्स थे। नीचे दिए गए उदाहरण से पता चलता है कि उपरोक्त उद्धरण के पूरे भाग के इनपुट को कैसे छोटा किया जाता है, जो आउटपुट पैडिंग को बदलता है:

http://en.wikipedia.org/wiki/Base64#Output_padding

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.