2016-10-07 2 views
4

Ich habe eine C# -Anwendung, die ein Byte-Array von einem externen Dienst empfängt, der eine UTF-8-codierte XML-Nachricht darstellt. Diese XML-Daten enthalten sensible Daten, die ich lieber nicht in einem String-Objekt gespeichert hätte, da Strings unveränderlich sind und ich die Werte nicht löschen kann, wenn ich damit fertig bin. Ich verwende derzeit System.XML.XmlReader, um die Werte als Zeichenfolgen zu analysieren (siehe Code unten). Wie kann ich dies tun, ohne dass mein Code (oder der Code, den ich anrufe) die sensiblen Daten als String speichert?Sicheres Parsen von XML in C#

 byte[] messsage = Encoding.UTF8.GetBytes(request); 
     // Send message to the server. 
     sslStream.Write(messsage); 
     sslStream.Flush(); 

     // read the response 
     byte[] buffer = new byte[2048]; 
     StringBuilder messageData = new StringBuilder(); 
     int bytes = -1; 
     do 
     { 
      bytes = sslStream.Read(buffer, 0, buffer.Length); 

      // Use Decoder class to convert from bytes to UTF8 
      // in case a character spans two buffers. 
      Decoder decoder = Encoding.UTF8.GetDecoder(); 
      char[] chars = new char[decoder.GetCharCount(buffer, 0, bytes)]; 
      decoder.GetChars(buffer, 0, bytes, chars, 0); 
      messageData.Append(chars); 
      // Check for ending tag. 
      if (messageData.ToString().IndexOf(expectedEndTag) != -1) 
      { 
       break; 
      } 
     } while (bytes > 0); 

     string response = messageData.ToString(); 

     using (XmlReader reader = XmlReader.Create(new StringReader(response))) 
     { 
      reader.ReadToFollowing("Success"); 
      string successVal = reader.ReadElementContentAsString(); 
      success = bool.Parse(successVal); 
     } 
+0

Verschlüsseln Sie den Wert. Es sollte trotzdem verschlüsselt werden, wenn es vom externen Dienst übertragen wird, weil ein schlechter Akteur die Daten abfangen könnte. –

+2

"Diese XML-Daten enthalten vertrauliche Daten, die ich lieber nicht in einem String-Objekt gespeichert hätte, da Strings unveränderlich sind und ich die Werte nicht löschen kann, wenn ich damit fertig bin". Siehe SecureString. Es soll vertraulich sein und nicht im Gedächtnis behalten werden. https://msdn.microsoft.com/en-us/library/system.security.securestring(v=vs.110).aspx – astidham2003

+0

Wenn Sie nur besorgt über die Saiten besorgt sind, die im Speicher herumstehen, könnten Sie in die Verwendung von SecureString schauen , https://msdn.microsoft.com/en-us/library/system.security.securestring(v=vs.110).aspx – Mumbo

Antwort

0

auf der Antwort Basierend, und angesichts der Tatsache, dass ein String unveränderlich ist, sollten Sie Ihren eigenen XML-Parser schreiben, die char [] verwendet. Wenn Sie mit dem Parsen fertig sind, löschen Sie den Inhalt des Char-Arrays. Um die sensiblen Daten im Programm zu verwenden, verwenden Sie die SecureString als @Ga ber-ber und @Mumbo in den Kommentaren vorgeschlagen.

Es ist schwer und Arbeitsverdopplung, aber auf diese Weise werden Sie sicher sein, dass der Speicher direkt nach dem Parsen gelöscht wird.