2009-06-11 9 views
19

में संवेदनशील डेटा को चिह्नित करें मुझे स्मृति में थोड़े समय के लिए उपयोगकर्ता का पासवर्ड स्टोर करने की आवश्यकता है। मैं ऐसा कैसे कर सकता हूं अभी तक ऐसी जानकारी को गलती से coredumps या tracebacks में प्रकट नहीं किया गया है? क्या मान को "संवेदनशील" के रूप में चिह्नित करने का कोई तरीका है, इसलिए यह डीबगर द्वारा कहीं भी सहेजा नहीं गया है?पायथन

+0

यह प्रश्न भी देखें: http://stackoverflow.com/questions/728164/securely-erasing-password-in-memory-python – Miles

उत्तर

30

संपादित

मैं एक समाधान (जो बारी में सी का उपयोग करता है) शून्य स्मृति को ctypes का उपयोग करता है बना दिया है।

import sys 
import ctypes 

def zerome(string): 
    location = id(string) + 20 
    size  = sys.getsizeof(string) - 20 

    memset = ctypes.cdll.msvcrt.memset 
    # For Linux, use the following. Change the 6 to whatever it is on your computer. 
    # memset = ctypes.CDLL("libc.so.6").memset 

    print "Clearing 0x%08x size %i bytes" % (location, size) 

    memset(location, 0, size) 

मुझे इस कोड की सुरक्षा की कोई गारंटी नहीं है। यह x86 और CPython 2.6.2 पर काम करने के लिए परीक्षण किया जाता है। एक लंबा लेखन here है।

पायथन में डिक्रिप्टिंग और एन्क्रिप्टिंग काम नहीं करेगा। स्ट्रिंग्स एंड इंटेगर्स इंटर्न और लगातार हैं, जिसका मतलब है कि आप जगह पर पासवर्ड की जानकारी का गड़बड़ कर रहे हैं।

हैशिंग मानक उत्तर है, हालांकि निश्चित रूप से सादे पाठ को अंततः संसाधित करने की आवश्यकता है।

सही समाधान एक सी मॉड्यूल के रूप में संवेदनशील प्रक्रियाओं को करना है।

लेकिन अगर आपकी याददाश्त लगातार समझौता किया जा रहा है, तो मैं आपके सुरक्षा सेटअप पर पुनर्विचार करूंगा।

+2

यह सही है। यदि आप पाइथन ऑब्जेक्ट में पासवर्ड को कभी भी/कभी पढ़ते हैं, तो डंप द्वारा समझौता किए जाने की संभावना है। सी का उपयोग भी सही नहीं है (आप अभी भी प्रोग्राम को फ्रीज कर सकते हैं और कर्नेल-स्तरीय डीबगर का उपयोग कर सकते हैं), लेकिन यह काफी अच्छा होना चाहिए। –

+0

लेखन मर चुका है। :( – Barry

+0

यदि यह निम्न लेख में उल्लिखित जैसा ही 'स्मृति' है, तो यह भी असुरक्षित है। Http://www.viva64.com/en/b/0178/ या https://www.owasp.org /index.php/Insecure_Compiler_Optimization – Danny

2

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

2
  • XOR अलग से संग्रहीत
  • हमेशा की तरह, बल्कि पासवर्ड खुद

से नमकीन हैश की दुकान या, यदि आप डंप के बारे में बहुत पागल हो कुछ अन्य में अद्वितीय यादृच्छिक कुंजी संग्रहीत जगह, उदाहरण के लिए मैं एक अलग धागा, एक रजिस्ट्री में, अपने सर्वर, आदि पर

4

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

def paranoid_add_character_to_list(ch, l): 
    """Copy l, adding a new character, ch. Erase l. Return the result.""" 
    new_list = [] 
    for i in range(len(l)): 
    new_list.append(0) 
    new_list.append(ch) 
    for i in range(len(l)): 
    new_list[i] = l[i] 
    l[i] = 0 
    return new_list 

स्रोत: http://www.ibm.com/developerworks/library/s-data.html

  • लेखक: जॉन विएगा ([email protected]) सुरक्षित सॉफ्टवेयर के निर्माण के सह लेखक है (एडिसन-वेस्ले, 2001) और जावा एंटरप्राइज़ आर्किटेक्चर (O'Reilly और एसोसिएट्स, 2001)।जॉन ने 50 से अधिक तकनीकी प्रकाशनों को मुख्य रूप से सॉफ्टवेयर सुरक्षा के क्षेत्र में लिखा है। उन्होंने सी और सी ++ कोड में सुरक्षा भेद्यता खोजने के लिए मेलमैन, जीएनयू मेलिंग लिस्ट मैनेजर और आईटीएस 4, टूल भी लिखा।
+0

एक संस्करण के रूप में: इस तकनीक का उपयोग एक [bytearray] (https : //docs.python.org/3.1/library/functions.html#bytearray) परिणाम किसी ऑब्जेक्ट में होता है जिसे 'बाइट्स' उदाहरण के स्थान पर उपयोग किया जा सकता है बहुत सारे पायथन कोड में ... और बाद में समकक्ष रूप से साफ़ किया जा सकता है। –