[VB] XML Datei verschlüssen oder verschlüsselt Strings/Booleans speichern

Terminator2

Erfahrenes Mitglied
Hallo,

Ich arbeite mittlerweile mit XML und speichere darin immer die Einstellungen für mein Programm.

Nur: Jetz will ich Benutzer anlegen und davon auch die Passwörter etc. speichern, ohne dass man einfach in den Pfad geht und sie lesen kann. Das wär ja wirklich der größte mist...

Weiß jemand wie man sowas machen kann? Irgendwie muss man doch Passwörter und andere Daten, die keiner sehen darf, speichern können...

Würde mich wirklich freuen, wenn mir jemand ein recht ienfaches Beispiel oÄ. posten könnte. Am besten wäre es meiner Meinung nach, die Daten mittels einem Passwort zu verschlüsseln, da man ja sonst nur den Code auf die Datei anwenden müsste und schon hat man die Daten.

Ich wär wirklich sehr froh, wenn mir da jemand weiterhelfen kann! :)
 
Hi Terminator2,

die einfachste Möglichkeit die du realisieren könntest ist eine XOR-Verschlüsselung. Dabei wird jedes Zeichen des Strings, den du verschlüsseln willst mit einem Zeichen aus deinem Passwort mit XOR verknüpft. Dies ist zwar keine besonders sichere Methode, jedoch verhindert man damit das direkt und schnelle "manuelle" auslesen der Passwörter aus der XML.

:google: Suche einfach mal Google nach XOR Verschlüsselung, dort wirst schnell fündig werden!

Gruß,
Sebastian
 
Hey,

Das hab ich jetzt noch einmal ausprobiert. Habe schon etliche Verschlüsselungsmethoden getestet. Aber XML kann nicht alle Zeichen anzeigen. Mit der XOR Verschlüsselung werden hin und wieder Strings so verschlüsselt, sodass man sie nicht mehr im XML Format anschauen kann, was wiederum zur Folge hat, dass man die Strings nicht mehr auslesen kann.
Ich hänge mal den Code an:
Code:
    Public Function VerEntschlüsseln(ByVal SrcString As String, _
      ByVal Pass As String) As String

        VerEntschlüsseln = ""

        On Error Resume Next
        Dim TmpInt As Integer, I, J
        Dim TmpArray() As Integer = Nothing
        ReDim TmpArray(0 To Len(Pass) - 1)

        'Ascii Codes des Passwortes in ein Array Speichern
        For I = 1 To Len(Pass)
            TmpArray(I) = Asc(Mid$(Pass, I, 1))
        Next I

        'Verschlüsselungs-Prozedur

        'Jeden Buchstaben einzeln verschlüsseln
        For I = 1 To Len(SrcString)
            'Für jeden Passwortbuchstaben einmal verschlüsseln
            'Buchstaben in Ascii-Wert umwandeln
            TmpInt = Asc(Mid$(SrcString, I, 1))
            For J = 1 To Len(Pass)
                'und mit Xor binär umwandeln
                TmpInt = TmpInt Xor TmpArray(J)
                'zur Sicherheit nocheimal binär umwandeln (Xor)
                TmpInt = TmpInt Xor J
            Next J

            'Das Null-Zeichen kann in einer TextBox
            'nicht angezeigt werden
            If TmpInt > 0 Then
                'Binär-Wert wieder in Ascii-Zeichen umwandeln
                VerEntschlüsseln = VerEntschlüsseln & Chr(TmpInt)
            Else
                'sonst Null-Zeichen-Konstante einfügen
                VerEntschlüsseln = VerEntschlüsseln & "%$0$%"
            End If
        Next I
    End Function

Den habe ich in vb@rchiv gefunden. Klappte anfangs sogar, aber mittlerweile nicht mehr. Und das soll ja kein Zufall sein, ob es funktioniert oder nicht. Kann mir jemand sagen wie ich Zeichen, die XML nicht verträgt, verhindern kann?

Vielen Dank!
 
Stimmt wohl, einige Zeichen könnten Probleme machen, aber ich mal ein wenig gegoogelt.

1.) Vielleicht hilft dir ja http://www.developer.com/net/net/article.php/3077901

2.) Ansonsten Schau dir mal den System.Security.Cryptography-Namespace an. Wahrscheinlich wirst du hier fündig.

3.) Nochmal zum XOR: Du könntest ja auch die gesamte Datei verschlüsseln und anschließend wieder entschlüsseln um mit dieser zu arbeiten. Dann solltest du das "Sonderzeichen"-Problem eigentlich nicht haben.

Gruß,
Sebastian
 
Hey,

Ja genau, dann hätte ich das Problem mit den Zeichen nicht. Aber ich hätte das Problem, dass die XML Datei trotzdem nicht funktioniert :mad: Dummerweise kann man eine XML Datei nicht einfach mit dem WriteAllBytes etc. erzeugen. Dafür muss man diese XML Prozedur durchgehen. Und eh ich das zusammen hab kann ich auch direkt auf die eigentlich schlechtere Methode zurückgreifen und direkt mit Textdateien etc. arbeiten...

Ich werde aber mal die anderen Links ausprobieren, vielleicht helfen mir die ja weiter.

Viele Grüße

Edit:

Habe mal das von Microsoft ausprobiert: Was fehlt da noch. Ein Passwort denke ich, aber ich weiß nich wo was fehlt. Kann mir da noch jemand helfen?
Code:
Imports System
Imports System.IO
Imports System.Text
Imports System.Security.Cryptography

Public Class Form1
    Public Sub Crypt()
        Dim key As RijndaelManaged = Nothing

        Try
            ' Create a new Rijndael key.
            key = New RijndaelManaged()
        Catch ex As Exception

        End Try
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        RijndaelManaged_Examples.MyMainClass.Main()
    End Sub
End Class

Namespace RijndaelManaged_Examples
    Class MyMainClass
        Public Shared Sub Main()
            Dim original As String = "This is a much longer string of data than a public/private key algorithm will accept."
            Dim roundtrip As String
            Dim textConverter As New ASCIIEncoding()
            Dim myRijndael As New RijndaelManaged()
            Dim fromEncrypt() As Byte
            Dim encrypted() As Byte
            Dim toEncrypt() As Byte
            Dim key() As Byte
            Dim IV() As Byte

            'Create a new key and initialization vector.
            myRijndael.GenerateKey()
            myRijndael.GenerateIV()

            'Get the key and IV.
            key = myRijndael.Key
            IV = myRijndael.IV

            'Get an encryptor.
            Dim encryptor As ICryptoTransform = myRijndael.CreateEncryptor(key, IV)

            'Encrypt the data.
            Dim msEncrypt As New MemoryStream()
            Dim csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)

            'Convert the data to a byte array.
            toEncrypt = textConverter.GetBytes(original)

            'Write all data to the crypto stream and flush it.
            csEncrypt.Write(toEncrypt, 0, toEncrypt.Length)
            csEncrypt.FlushFinalBlock()

            'Get encrypted array of bytes.
            encrypted = msEncrypt.ToArray()

            'This is where the message would be transmitted to a recipient
            ' who already knows your secret key. Optionally, you can
            ' also encrypt your secret key using a public key algorithm
            ' and pass it to the mesage recipient along with the RijnDael
            ' encrypted message.            
            'Get a decryptor that uses the same key and IV as the encryptor.
            Dim decryptor As ICryptoTransform = myRijndael.CreateDecryptor(key, IV)

            'Now decrypt the previously encrypted message using the decryptor
            ' obtained in the above step.
            Dim msDecrypt As New MemoryStream(encrypted)
            Dim csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)

            fromEncrypt = New Byte(encrypted.Length) {}

            'Read the data out of the crypto stream.
            csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length)

            'Convert the byte array back into a string.
            roundtrip = textConverter.GetString(fromEncrypt)

            'Display the original data and the decrypted data.
            Console.WriteLine("Original:   {0}", original)
            Console.WriteLine("Round Trip: {0}", roundtrip)
        End Sub 'Main
    End Class 'MyMainClass
End Namespace 'RijndaelManaged_Examples
 
Zuletzt bearbeitet:
Das ist wirklich eine gute Idee...

Aber wie wende ich das an? Ich habe da schon öfters Probleme mit gehabt. Der meckert immer dass er den String nicht zu einem 1-dimensionalen Array konvertieren kann.

Ich poste mal den Code mit. Die Funktion VerEntschlüsseln gibt mir einen String zurück, der aber nicht in XML funktioniert. Also wie kann ich den String umändern... Wäre es nicht eine Idee, diesen Wert einfach in Dualzahlen zu konvertieren? Nullen und Einsen kann XML ja glücklicherweise ^^

Code:
Dim Wert As String
Wert = VerEntschlüsseln(Parameter.BenutzerNamen(i), "07855")
XMLObj.WriteAttributeString("74V1I8J6", Wert)

Also schon mal Danke für die Lösung ;) Bin mir sicher dass Ihr mir weiterhelfen könnt. Aber die Base64 Methode wär wirklich gut :)
 
C#:
string base64Wert = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(Wert));

ToBase64String braucht ein byte Array. Kannst nämlich aus jeder Bytemenge einen Base64 String erstellen.. muss kein Text sein.
 
Hallo,

Habe das mal ausprobiert. Das funktioniert jetzt mit dem Schreiben. Ich hatte noch ein Problem mit dem Namen von dem Element, hatte da einen Zufallswert generiert. Aber das funktioniert nicht. Also nehme ich einfach E1 E2 usw.

Jetzt nur noch die Frage wie ich die Werte wieder aus der XML Datei richig rausbekomme. Also mit dem Convert From Base64 String und dann decodieren oder so. Habe zwar danach gesucht, aber nichts gefunden...

Code:
Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(Wert))
Convert.FromBase64String(...(Wert))

Schonmal Danke für den richtigen Befehl
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück