2009-04-08 11 views
35

उपयोगकर्ता द्वारा स्मृति में दर्ज पासवर्ड को आप कैसे संग्रहीत करते हैं और इसकी आवश्यकता होने के बाद इसे सुरक्षित रूप से मिटा दें?मेमोरी (पायथन) में पासवर्ड को सुरक्षित रूप से मिटाना

विस्तार करने के लिए, वर्तमान में हम निम्नलिखित कोड है: login विधि कॉल करने के बाद

username = raw_input('User name: ') 
password = getpass.getpass() 
mail = imaplib.IMAP4(MAIL_HOST) 
mail.login(username, password) 

, क्या हम इतना है कि किसी को प्राप्त नहीं कर सकता है कि विकृत अक्षरों के साथ पासवर्ड शामिल स्मृति के क्षेत्र को भरने के लिए क्या करना होगा कोर डंप कर पासवर्ड?

एक ऐसी ही सवाल ही नहीं है, लेकिन यह जावा में है और समाधान चरित्र सरणियों का उपयोग करता है: How does one store password hashes securely in memory, when creating accounts?

इस अजगर में किया जा सकता है?

+0

इस [आईबीएम आलेख] के नीचे [http://www.ibm.com/developerworks/library/s-data.html?ns-311), वे एक अपरिवर्तनीय के बजाय एक परिवर्तनीय डेटा संरचना का उपयोग करने के बारे में बात करते हैं स्ट्रिंग। –

+0

उपरोक्त टिप्पणी में आईबीएम आलेख का लिंक अब और काम नहीं करता है, एक [संग्रहीत पृष्ठ] का उपयोग करें (https://web.archive.org/web/20150308000622/http://www.ibm.com/developerworks/ पुस्तकालय/एस-data.html)। –

उत्तर

37

पायथन में स्मृति पर नियंत्रण का स्तर कम नहीं है। इसे स्वीकार करें और आगे बढ़ें। सर्वोत्तम पर mail.login पर कॉल करने के बाद आप कर सकते हैं ताकि पासवर्ड स्ट्रिंग ऑब्जेक्ट का कोई संदर्भ न रहे। कोई भी समाधान जो इससे अधिक करने में सक्षम होने के लिए अधिकृत है, केवल आपको सुरक्षा की झूठी भावना दे रहा है।

पायथन स्ट्रिंग ऑब्जेक्ट्स अपरिवर्तनीय हैं; इसे बनाए जाने के बाद स्ट्रिंग की सामग्री को बदलने का कोई सीधा तरीका नहीं है। भले ही आप किसी भी तरह password (जो बेवकूफ ctypes चाल के साथ तकनीकी रूप से संभव है) द्वारा संदर्भित स्ट्रिंग की सामग्री को ओवरराइट करने में सक्षम थे, फिर भी विभिन्न स्ट्रिंग ऑपरेशंस में बनाए गए पासवर्ड की अन्य प्रतियां होंगी:

    getpass मॉड्यूल जब यह स्ट्रिप्स inputted पासवर्ड
  • imaplib मॉड्यूल जब यह पासवर्ड उद्धरण और फिर इसे सॉकेट
के लिए रवाना पार करने से पहले पूरा IMAP आदेश बनाता द्वारा की बंद अनुगामी न्यू लाइन द्वारा
  • आप डब्ल्यू किसी भी तरह से उन सभी तारों के संदर्भ प्राप्त करना होगा और उनकी याददाश्त को ओवरराइट करना होगा।

  • +9

    इस संभावना का जिक्र नहीं है कि ओएस आपके पूरे मेमोरी पेज को डिस्क पर बाहर कर देगा, जहां यह महीनों तक बैठ सकता है। – JasonSmith

    +0

    स्वैप समस्या पायथन विशिष्ट का नहीं है, लेकिन यहां उस हिस्से के बारे में एक चर्चा है: https://security.stackexchange.com/questions/29350/swap-file-may-contain-sensitive-data – Zitrax

    -2

    संपादित करें: बुरी सलाह हटा दिया ...

    तुम भी जावा उदाहरण की तरह सरणियों उपयोग कर सकते हैं यदि आप चाहें, लेकिन सिर्फ अधिलेखन यह पर्याप्त होना चाहिए।

    http://docs.python.org/library/array.html

    +1

    सभी पासवर्ड = "कुछ" पहले पुराने पासवर्ड के संदर्भ को हटा देता है। यह वास्तव में कुछ भी ओवरराइट नहीं करता है। – Miles

    +0

    मैं देखता हूं। जानकारी के लिए धन्यवाद। –

    -2

    स्टोर एक सूची में पासवर्ड, और अगर तुम सिर्फ सूची शून्य पर सेट, सरणी सूची में संग्रहीत की स्मृति स्वचालित रूप से मुक्त हो जाता है।

    +7

    सूची में स्ट्रिंग को संग्रहित करने का संकेत शून्य स्तर प्रदान करता है। – Miles

    +2

    इसके अलावा, मुक्त होने के बाद स्मृति को साफ़ करने के लिए कोई विनिर्देश नहीं है। स्मृति बरकरार रहेगी और समय के साथ डिस्क पर इमेज या स्वैप होने के लिए कमजोर होगी। – drifter

    +0

    यह एक अच्छा लेख है कि यह ठीक से काम क्यों नहीं करता है: http://effbot.org/pyfaq/why-doesnt-python-release-the-memory-when-i-delete-a-large-object.htm – mkind

    7

    आप मेल वस्तु की जरूरत नहीं है लागू करने के लिए एक बार आप इसे के साथ किया जाता है, मुझे लगता है कि आपका सर्वश्रेष्ठ दांव एक उपप्रक्रिया में मेलिंग काम को करने के है इस तरह (subprocess मॉड्यूल देखें।), जब उपप्रक्रिया मर जाता है , तो आपका पासवर्ड चला जाता है।

    17

    वास्तव में - पाइथन में स्ट्रिंग को सुरक्षित रूप से मिटाने का एक तरीका है; के रूप में प्रति Mark data as sensitive in python

    +1

    ध्यान दें कि यह ओएस है निर्भर। लिंक और पोस्ट में विंडोज और लिनक्स कोड दिया गया है। – Luc

    2

    यह numpy chararray का उपयोग किया जा सकता है memset सी फ़ंक्शन का उपयोग करें,:

    import numpy as np 
    
    username = raw_input('User name: ') 
    mail = imaplib.IMAP4(MAIL_HOST) 
    x = np.chararray((20,)) 
    x[:] = list("{:<20}".format(raw_input('Password: '))) 
    mail.login(username, x.tobytes().strip()) 
    x[:] = '' 
    

    आप पासवर्ड का अधिकतम आकार का निर्धारण करने के लिए होगा, लेकिन जब यह ओवरराइट है इस डेटा निकाल देना चाहिए।

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