2010-09-24 20 views
13

यह प्रश्न @sharptooth द्वारा this related question में किए गए एक सुझाव का पालन करता है।पासवर्ड-सुरक्षित कक्षा कैसे लिखें?

std::string tweaked किया जा सकता है ताकि यह पासवर्ड-सुरक्षित हो जाए?

यदि नहीं, तो पासवर्ड-हैंडलिंग क्लास लिखने के दिशानिर्देश क्या होंगे (इस प्रकार एक वर्ग जो स्मृति के बारे में बड़ी देखभाल करता है और विनाश से पहले इसे साफ़ करता है)?

template <class T> class SecureAllocator : public std::allocator<T> 
{ 
public: 
    template<class U> struct rebind { typedef SecureAllocator<U> other; }; 

    SecureAllocator() throw() {} 
    SecureAllocator(const SecureAllocator&) throw() {} 
    template <class U> SecureAllocator(const SecureAllocator<U>&) throw() {} 

    void deallocate(pointer p, size_type n) 
    { 
     std::fill_n((volatile char*)p, n*sizeof(T), 0); 
     std::allocator<T>::deallocate(p, n); 
    } 
}; 

यह संभाजक deallocating से पहले स्मृति शून्य:

+1

1) std: wstring, 2) पासवर्ड प्रतीकों के बजाय 0x2022 पुश करें: ओ) गंभीरता से, अगर आपको डर है कि अन्य प्रक्रिया आपकी याददाश्त से कुछ छीनती है, तो इसमें कुछ मुखौटा जोड़ें/हटाएं (xor?) – alxx

+0

@alxx : 'Std :: string' के बजाय' std :: wstring' का उपयोग कैसे सुरक्षित होगा? क्या मैं कुछ भूल रहा हूँ ? – ereOn

+1

0x2022 बुलेट प्रतीक है। उसे ले लो? :) – alxx

उत्तर

19

हाँ, पहले एक कस्टम संभाजक परिभाषित करते हैं। अब आप typedef:

typedef std::basic_string<char, std::char_traits<char>, SecureAllocator<char>> SecureString; 

लेकिन वहाँ है एक छोटी सी समस्या, std :: स्ट्रिंग छोटे स्ट्रिंग अनुकूलन का उपयोग और गतिशील आवंटन के बिना, के अंदर ही कुछ डेटा स्टोर कर सकते हैं।

int main(int, char**) 
{ 
    using boost::shared_ptr; 
    using boost::allocate_shared; 
    shared_ptr<SecureString> str = allocate_shared<SecureString>(SecureAllocator<SecureString>(), "aaa"); 

} 

यह गारंटी देता है कि सभी डेटा आवंटन रद्द करने से पहले ध्यान केंद्रित किया है, स्ट्रिंग के आकार सहित, उदाहरण के लिए: तो आप विनाश पर स्पष्ट रूप से स्पष्ट है कि यह करना चाहिए या हमारे कस्टम संभाजक साथ ढेर पर आवंटित।

+5

'std :: fill_n' का उपयोग न करें, 'SecureZeroMemory()' (http://msdn.microsoft.com/en-us/library/aa366877(VS.85).aspx) जैसे कुछ का उपयोग करें - 'std के साथ :: fill_n' कंपाइलर मिटाए जाने को अनुकूलित कर सकता है। – sharptooth

+0

'std :: string' को बल देने के लिए एक चिमटा भी है जब कॉलिंग कोड स्ट्रिंग को छोटा करने का कारण बनता है - उदाहरण के लिए पहले एन तत्व हटाते हैं और इसलिए पूंछ को "बाएं ओर" स्थानांतरित किया जाता है और दाईं ओर वर्ण छोड़ देता है "? – sharptooth

+1

@sharptooth SecureZeroMemory मानक नहीं है, और अस्थिर अनुकूलन रोकता है। हां, अगर कोई सिस्टम कॉल नहीं है तो सीपीयू कैश फ्लश करने से पहले कुछ डेटा मेमोरी में रह सकता है। – ybungalobill

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