2010-11-30 15 views
6

यह मेरे लिए एक पहेली है और मैं वास्तव में नाराज हूं कि मैं इसे हल नहीं कर सकता! इसलिए, अगर किसी के पास कुछ खाली समय है तो मैं इसे हल करने के तरीके पर कुछ सुझाव यहां देना चाहूंगा!क्या यह स्ट्रिंग बेस 64 है? मैं कैसे बता सकता हूं कि एन्कोडिंग का उपयोग क्या किया जाता है?

मैं ऐसे सॉफ़्टवेयर का उपयोग करता हूं जो एक ऑरैकल डेटाबेस में पासवर्ड संग्रहीत करता है। पासवर्ड फ़ील्ड Varchar2 (100 char) प्रकार का है। ऐसा लगता है कि सॉफ़्टवेयर पासवर्ड को एन्कोड करता है और डेटाबेस में एन्कोडेड स्ट्रिंग स्टोर करता है।

मेरा पासवर्ड '1234' है और एन्कोडेड स्ट्रिंग 'cRDtpNCeBiql5KOQsKVyrA0sAiA =' है। डेटाबेस में सभी पासवर्ड 28 वर्ण लंबा हैं।

जो पहेली मैंने स्वयं को सौंपी है वह स्ट्रिंग के एन्कोडिंग और/या एन्क्रिप्शन को ढूंढना है।

मेरी पहली जांच Base64

पर था तो यहाँ अजगर में मेरी पहली परीक्षा है (निष्क्रिय):

>>> import base64 
>>> encoded = 'cRDtpNCeBiql5KOQsKVyrA0sAiA=' 
>>> decoded = base64.b64decode(encoded) 
>>> decoded 
'q\x10\xed\xa4\xd0\x9e\x06*\xa5\xe4\xa3\x90\xb0\xa5r\xac\r,\x02 ' 
>>> print decoded 
qíᄂО*ᆬ䣐ᄚᆬrᆲ 

,

यहाँ मेरी दूसरे टेस्ट है: तो

>>> myString = '1234' 
>>> encoded = base64.b64encode(myString) 
>>> encoded 
'MTIzNA==' 
>>> decoded = base64.b64decode('MTIzNA==') 
>>> decoded 
'1234' 

, मेरे पहला विचार यह है कि यह बेस 64 एन्कोडेड नहीं है। विकिपीडिया (https://en.wikipedia.org/wiki/Base64) की जांच करने के बाद ऐसा लगता है कि बेस 64 एन्कोडेड स्ट्रिंग निश्चित आकार के नहीं हैं। मेरा दूसरा विचार यह है कि स्ट्रिंग को एन्क्रिप्ट किया गया था और फिर बेस 64 में एन्कोड किया गया था और यही कारण है कि मुझे अजीब दिखने वाली डीकोडेड स्ट्रिंग मिलती है।

कोई विचार?

+0

वह sha1 हैश का बेस 64 एन्कोडिंग हो सकता है जो 'लेन (base64.b16encode (base64.b64decode (' cRDtpNCeBiql5KOQsKVyrA0sAiA = '))) '' 40' है? –

+0

मुझे आश्चर्य है कि यह डिक्रिप्ट करना ठीक है (ठीक है, यह वास्तव में डिक्रिप्ट नहीं है) SHA1 हैश पासवर्ड में है क्योंकि मुझे सभी बाधाओं (न्यूनतम लंबाई, अधिकतम लंबाई, अल्फा, राजधानियां, संख्याएं, विशेष वर्ण इत्यादि) पता है ... शायद मुझे एक और सवाल पूछना चाहिए! :) –

+0

दान मुझे समझ में नहीं आता कि आप बी 16encode का उपयोग क्यों करते हैं, क्या आप समझा सकते हैं? –

उत्तर

13

यह वास्तव में बेस 64 एन्कोडेड है। हालांकि, यह पासवर्ड स्वयं ही एन्कोड नहीं किया गया है, लेकिन इसका SHA-1 हैश है।

from sha import sha 
print 'cRDtpNCeBiql5KOQsKVyrA0sAiA='.decode('base64').encode('hex') 
print sha('1234').hexdigest() 

या अजगर के नए संस्करणों के लिए:

from hashlib import sha1 
print 'cRDtpNCeBiql5KOQsKVyrA0sAiA='.decode('base64').encode('hex') 
print sha1('1234').hexdigest() 

Base64 4 पात्रों के रूप में 3 बाइट्स encodes। चूंकि आपके पास एक पैडिंग के साथ 27 वर्ण हैं, तो आप देख सकते हैं कि 20 एन्कोडेड बाइट्स हैं (27*3/4)। जब कुछ सुरक्षा संबंधित 20 बाइट्स (या 160 बिट्स) लंबी होती है, तो आमतौर पर यह SHA-1 होती है। जब यह 16 बाइट्स (128 बिट्स) होता है, तो यह आमतौर पर एमडी 5 होता है।

बीटीडब्ल्यू, मिश्रण में यादृच्छिक नमक जोड़ने के लिए हमेशा एक अच्छा विचार है, इसलिए दो समान पासवर्ड डेटाबेस में नहीं रहेंगे। लिनक्स पर, crypt मॉड्यूल आपको इसके साथ मदद करता है और कुछ और सुरक्षा उपायों में फेंकता है।

संपादित करें: एक और टिप्पणी का उत्तर देने के लिए - "एन्क्रिप्टेड" पासवर्ड से मूल प्राप्त करना बहुत आसान है।एक ऐसी तकनीक है जो कुछ साल पहले इंद्रधनुष टेबल्स नामक प्रसिद्ध हो गई थी। इसके online versions भी हैं। हेक्स में अपने हैश टाइप करें (7110eda4d09e062aa5e4a390b0a572ac0d2c0220) और यह आपको एक सेकंड में 1234 देगा।

+2

जो सवाल पूछता है, क्या असुरक्षित सॉफ़्टवेयर * किसी * नमक के बिना पासवर्ड संग्रहीत करता है? –

+0

'आयात हैशिब' अधिक उपयुक्त होगा ('निष्क्रिय 'शिकायत है कि' शा 'को बहिष्कृत किया गया है)। इसके अलावा जवाब बहुत अच्छा है, धन्यवाद! –

+0

मैथ्यू, सिस्टम किसी भी नमक के बिना पासवर्ड स्टोर करता है और सिस्टम लिनक्स पर चलता है। –

5

जबकि len(decoded) = 20 तब मुझे लगता है कि यह बेस 64 एन्कोडेड SHA1 हैश है।

आप द्वारा इस तरह कोडित पासवर्ड बनाने के कर सकते हैं:

import hashlib 
import base64 
passwd = '1234' 
hp = base64.b64encode(hashlib.sha1(passwd).digest()) 
print hp 
print len(hp) 

इस तरह के भंडारण के पासवर्ड के लिए के रूप में: यह बहुत अच्छा है, जबकि कई पटाखे precomputed MD5, SHA1 और अन्य हैश और वे कर सकते हैं के साथ "इंद्रधनुष" तालिकाओं का उपयोग कर सकते हैं नहीं है ऐसे हैश पर आधारित पासवर्ड प्राप्त करें। इसे रोकने के लिए "नमक" का उपयोग किया जाना चाहिए: hash(salt+passwd), ऐसे नमक प्रति उपयोगकर्ता डेटाबेस में सहेजे गए यादृच्छिक स्ट्रिंग हो सकते हैं या उदाहरण के लिए उपयोगकर्ता लॉगिन (ऐसा कुछ जिसे कभी बदला नहीं जा सकता)।

+1

नहीं, एमडी 5 के रूप में 16 बाइट लंबा होगा, क्योंकि यह 20 है sha1 –

+0

बेशक, धन्यवाद, –

+0

Michal बदल गया, आपका उत्तर भी सही है। आपकी सहायताके लिए धन्यवाद! –

संबंधित मुद्दे