2009-05-23 11 views
5

मैं .NET में एक सामान्य स्ट्रिंग एन्क्रिप्शन क्लास की तलाश में हूं। ('सिक्योरस्ट्रिंग' वर्ग से भ्रमित नहीं होना चाहिए।)सामान्य स्ट्रिंग एन्क्रिप्शन

मैंने अपनी कक्षा के साथ आने शुरू कर दिया है, लेकिन सोचा कि वहां एक .NET क्लास होना चाहिए जो आपको पहले से ही किसी भी एन्कोडिंग के स्ट्रिंग को एन्क्रिप्ट/डिक्रिप्ट करने की अनुमति देता है कोई क्रिप्टोग्राफिक सेवा प्रदाता।

Public Class SecureString 

     Private key() As Byte 
     Private iv() As Byte 
     Private m_SecureString As String 

     Public ReadOnly Property Encrypted() As String 
      Get 
       Return m_SecureString 
      End Get 
     End Property 

     Public ReadOnly Property Decrypted() As String 
      Get 
       Return Decrypt(m_SecureString) 
      End Get 
     End Property 

     Public Sub New(ByVal StringToSecure As String) 
      If StringToSecure Is Nothing Then StringToSecure = "" 
      m_SecureString = Encrypt(StringToSecure) 
     End Sub 

     Private Function Encrypt(ByVal StringToEncrypt As String) As String 

      Dim result As String = "" 
      Dim bytes() As Byte = Text.Encoding.UTF8.GetBytes(StringToEncrypt) 

      Using provider As New AesCryptoServiceProvider() 

       With provider 
        .Mode = CipherMode.CBC     
        .GenerateKey() 
        .GenerateIV() 
        key = .Key 
        iv = .IV 
       End With 

       Using ms As New IO.MemoryStream 
        Using cs As New CryptoStream(ms, provider.CreateEncryptor(), CryptoStreamMode.Write) 
         cs.Write(bytes, 0, bytes.Length) 
         cs.FlushFinalBlock() 
        End Using 
        result = Convert.ToBase64String(ms.ToArray()) 
       End Using 

      End Using 

      Return result 

     End Function 

     Private Function Decrypt(ByVal StringToDecrypt As String) As String 

      Dim result As String = "" 
      Dim bytes() As Byte = Convert.FromBase64String(StringToDecrypt) 

      Using provider As New AesCryptoServiceProvider() 

       Using ms As New IO.MemoryStream 
        Using cs As New CryptoStream(ms, provider.CreateDecryptor(key, iv), CryptoStreamMode.Write) 
         cs.Write(bytes, 0, bytes.Length) 
         cs.FlushFinalBlock() 
        End Using 
        result = Text.Encoding.UTF8.GetString(ms.ToArray()) 
       End Using 

      End Using 

      Return result 

     End Function 

    End Class 
+0

Uhm, आप डिक्रिप्शन के लिए चतुर्थ पारित करने के लिए की जरूरत है। – Migol

+0

@ मिगोल - क्या आप अपनी टिप्पणी को और स्पष्ट कर सकते हैं? – user111370

+0

चतुर्थ opentext के माध्यम से भेजा जा सकता है और आपकी स्ट्रिंग को डिक्रिप्ट करने के लिए कुंजी के अलावा कुछ डेटा शामिल है। – Migol

उत्तर

4

सममित एन्क्रिप्शन के लिए AES एल्गोरिथ्म आम तौर पर तार के सामान्य एन्क्रिप्शन के लिए जाने का रास्ता है। हालांकि, मुझे डर है कि .NET BCL आपके लिए मूल एन्क्रिप्शन/डिक्रिप्शन कक्षाएं और फ़ंक्शंस प्रदान करने के लिए चीजों को और आसान नहीं बनाता है।

आप this page पर स्ट्रिंग एन्क्रिप्शन के लिए विशेष रूप से क्रिप्टोग्राफिक कक्षाओं का उपयोग करने का एक अच्छा उदाहरण पा सकते हैं। ऐसा लगता है कि वास्तव में बहुत पूर्ण और अच्छी तरह से टिप्पणी की गई है - आप यह भी पा सकते हैं कि आप इसे बिना किसी संशोधन के उपयोग कर सकते हैं। नोट: रिजेंडेलएईएस के समान एल्गोरिदम है। (। तकनीकी तौर पर, पूर्व एल्गोरिथ्म का असली नाम को संदर्भित करता है, और बाद उन्नत एन्क्रिप्शन स्टैंडर्ड)

+0

@ नोल्डोरिन - लिंक के लिए धन्यवाद! क्या कोई सामान्य कार्य है जिसे मैं किसी भी एन्कोडिंग की स्ट्रिंग पास कर सकता हूं और क्रिप्टोग्राफिक सेवा प्रदाताओं का उपयोग कर सकता हूं? – user111370

+0

@ क्रिप्टोस्पिन: कोई समस्या नहीं। बस एहसास हुआ कि मैंने आपके मूल प्रश्न को थोड़ा गलत समझा। मैंने पोस्ट को थोड़ी अधिक जानकारी के साथ अपडेट किया है, वैसे भी। आपके लिए यह करने के लिए .NET ढांचे में निश्चित रूप से कोई सहायक वर्ग/विधियां नहीं हैं, मुझे डर है, हालांकि लिंक किए गए पृष्ठ पर दिए गए कोड को आपको एक अच्छा प्रारंभिक बिंदु प्रदान करना चाहिए। इसके बारे में जाने का एक अच्छा तरीका यहां विस्तार विधियों का उपयोग करना हो सकता है। – Noldorin

3

आप एक ही लक्ष्य को प्राप्त करने की कोशिश कर रहे हैं, तो .NET के SecureString के रूप में, तो आपका उदाहरण वास्तव में समस्या का समाधान नहीं करता है। (मैं आपके लक्ष्यों को गलत समझ सकता हूं, इस मामले में मैं क्षमा चाहता हूं।)

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

भले ही आपकी सिक्योरस्टिंग क्लास स्ट्रिंग को एक निजी चर में एन्क्रिप्ट करता है, फिर भी मूल स्ट्रिंग जो पारित की गई थी वह अभी भी असुरक्षित है। यह जीसी इसे इकट्ठा करने से पहले थोड़ी देर तक चिपक सकता है, या, अगर उस स्ट्रिंग को प्रशिक्षित किया गया था, तो यह उस प्रक्रिया की अवधि के लिए जी रहेगा जो यह रहता है। आंतरिक तारों को एक टेबल में संग्रहीत किया जाता है, जो उन्हें ढूंढना भी आसान बनाता है।

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

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

मैंने .NET 2.0 के सिक्योरस्टिंग के संस्करण की तरह बेहतर, अधिक .NET बनाने की कोशिश की है, लेकिन कभी भी ऐसा कुछ भी तैयार करने में सक्षम नहीं है जो वास्तव में सुरक्षित है। आप स्ट्रिंग वेरिएबल को पॉइंटर प्राप्त कर सकते थे जिसे डिक्रिप्ट किया गया था, इसे मिटा दें, प्रत्येक अक्षर को शून्य पर सेट करें, आदि। हालांकि यह कुछ भी समस्याग्रस्त हो सकता है कि कुछ भी अभी भी उस स्ट्रिंग का संदर्भ दे रहा है, जिससे गायब पाठ, दूषित पठन आदि हो रहा है। यदि स्ट्रिंग को प्रशिक्षित किया जाता है, जिसका आम तौर पर इसका मतलब है कि इसे कई चीजों से लंबे समय तक इस्तेमाल किया जा रहा है, तो इसे पोंछने से केवल एक ही संस्करण पोंछता है, और इसके सभी उपयोगों को प्रभावित करता है।भले ही आपने अपनी सुरक्षित स्ट्रिंग की प्रतिलिपि सफलतापूर्वक मिटा दी है, इस बात की कोई गारंटी नहीं है कि इसे मिटाए जाने से पहले अन्य कोड द्वारा इसकी प्रतिलिपि नहीं बनाई गई थी (यानी आप अपनी स्ट्रिंग को कुछ वेब सेवा पर भेज दें ... अब यह और अधिक में रहती है दुनिया भर के विभिन्न भौतिक स्थानों में संभवतः एक प्रक्रिया स्थान से अधिक।)

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

+0

पोस्ट करने के लिए समय लेने के लिए धन्यवाद। यदि आप ओपी पढ़ते हैं तो मैं स्पष्ट रूप से बताता हूं "('सिक्योरस्ट्रिंग' वर्ग से भ्रमित नहीं होना चाहिए।)" – user111370

+0

"यह आपकी स्मृति स्थान की जांच करने की कोशिश करने वाले किसी भी व्यक्ति से स्ट्रिंग की सुरक्षा करता है" यह लक्ष्य नहीं करता है और इसका लक्ष्य नहीं रखता है। यदि आप किसी प्रक्रिया की स्मृति को पढ़ सकते हैं तो आप लगभग निश्चित रूप से मूल कोड भी इंजेक्ट कर सकते हैं, जिस पर 'सिक्योरस्ट्रिंग' के पीछे सादे पाठ को निकालने वाला बिंदु छोटा है। यह केवल स्ट्रिंग डंप, स्वैप फ़ाइल इत्यादि से स्ट्रिंग को रखता है – CodesInChaos

+0

@CodesInChaos: टेक्स्ट सादा नहीं है, यह एन्क्रिप्ट किया गया है। यदि एक 'सिक्योरस्ट्रिंग' ने एक गैर-प्रबंधित ढेर पर सादा पाठ संग्रहीत किया है, तो मैं सहमत होगा, यह शायद इसे केवल क्रैश डंप, स्वैप फ़ाइल इत्यादि से बाहर रखेगा। यह देखते हुए कि स्ट्रिंग एन्क्रिप्ट की गई है, यह जांच करने वाले किसी भी व्यक्ति की सुरक्षा करता है आपकी याददाश्त तुरंत इसके मूल्य प्राप्त करने से। निश्चित रूप से, क्रूर बल या संभावित रूप से ज्ञात हमले (यदि आपके सुरक्षा प्रोटोकॉल के लिए कोई है) तो अभी भी संभावित रूप से एन्क्रिप्शन तोड़ सकता है, लेकिन यह तकनीकी रूप से हर सुरक्षा तंत्र के मामले में है। तो मैं अपने बयान से खड़ा हूं। – jrista

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