Wie DataSet-Daten ver- und entschlüsseln?

  • VB.NET
  • .NET (FX) 4.0

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von PapaBeer92.

    Wie DataSet-Daten ver- und entschlüsseln?

    ausgelagert aus Dataset Verschlüsseln ~VaporiZed

    Ich muss hier leider einmal Leichenschändung betreiben :D

    Ich möchte mein DataSet Verschlüsseln, um den Datenschutz einzuhalten. Das DataSet ist, wie in den Videos von EDR, direkt an die Controls gebunden. Im FormLoad ist dann

    VB.NET-Quellcode

    1. Public Class frmMain
    2. Private ReadOnly _dataPathCalls As String = My.Computer.FileSystem.GetFileInfo(Application.ExecutablePath).DirectoryName & "\callLog.xml"
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. With DataSet1
    5. If File.Exists(installDir & "\callLog.xml") Then
    6. Try
    7. .ReadXml(_dataPathCalls, XmlReadMode.ReadSchema)
    8. WriteLog("DB Eingelesen von " & _dataPathCalls)
    9. Catch ex As Exception
    10. WriteLog(ex.Message)
    11. MsgBox(ex.Message)
    12. End Try
    13. End If
    14. End With
    15. End Sub
    16. End Class


    Nun habe ich nach einigem Googeln eine Klasse gefunden, mit welcher ich das DataSet Ver und Entschlüsseln kann (könnte...)

    mycsharp.de/forum/threads/5385…ln-de-komprimieren?page=1

    Nur übergebe ich der Funktion ja ein DataSet, und erhalte eines zurück. Ich blicke nicht so recht durch, wie ich das jetzt Einbinde?

    Sinn ist ja, die Daten in der XML verschlüsselt zu lassen, und nur im Programm selbst zu Entschlüsseln. Das hat Kilian ja mit dem MemoryStream ja schon gut gelöst.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    die verlinkte Methode scheint mir unsinnig.
    Was soll ein verschlüsseltes Dataset - kann ja keiner nix draus lesen?
    Man kann ein Dataset allenfalls als verschlüsselte Datei abspeichern.

    Zu Verschlüsseln habich auch Tut gemacht im Tut-Bereich.
    Da wird sogar ein Dataset verschlüsselt abgespeichert.
    Verschlüsseln und Autentifizieren
    Ist schon was her das ich mich in DataSet einlesen wollte...
    Aber ist ein DataSet nicht im Grunde genommen eine Datenbank im RAM-Speicher?
    Um diese Daten dann zu persistieren werden sie als Xml-Datei gespeichert.

    Würde es nicht reichen, die Xml-Datei vor dem Speichern zu verschlüsseln und beim Laden wieder zu entschlüsseln.
    .XMl ist ja auch nix weiter als 'string'. Für eine Verschlüsselung einer 'String-Datei' hab ich was gecodet.

    Wie gut/schlecht das jetzt ist ??? Können ja erfahrenere Foristen kommentieren.
    (Edit hab noch den Link gefunden wo ich das her hab: c-sharpcorner.com/article/encr…symmetric-key-in-c-sharp/)

    Falls es Dir nur darum geht die Daten verschlüsselt zu speichern. Wäre das eventuell eine Möglichkeit
    -- C# AES Verschlüsselung:
    Spoiler anzeigen

    C#-Quellcode

    1. internal class MyAes
    2. {
    3. readonly string secureSecretKeyPhrase = "IchBinDerSchluesselFuerDieVerschluesselung";
    4. public byte[] SecureSecretKeyBytes { get; set; }
    5. public MyAes()
    6. {//create HashBytes from a string as Key
    7. using SHA256 sHA256 = SHA256.Create();
    8. SecureSecretKeyBytes = sHA256.ComputeHash(Encoding.UTF8.GetBytes(secureSecretKeyPhrase));
    9. }
    10. public string Encrypt(string clearText)
    11. {//create Cipher from ClearText
    12. if (string.IsNullOrEmpty(clearText))
    13. return "";
    14. byte[] cipherBytes;
    15. byte[] IvBytes;
    16. using Aes aesSecure = Aes.Create();
    17. aesSecure.Key = SecureSecretKeyBytes;
    18. ICryptoTransform encryptor = aesSecure.CreateEncryptor(aesSecure.Key, aesSecure.IV);
    19. using MemoryStream memorystream = new();
    20. using CryptoStream cryptoStream = new((Stream)memorystream, encryptor, CryptoStreamMode.Write);
    21. using (StreamWriter streamWriter = new((Stream)cryptoStream))
    22. {
    23. streamWriter.Write(clearText);
    24. }
    25. cipherBytes = memorystream.ToArray();
    26. IvBytes = aesSecure.IV;
    27. //DB EntryString As Base64String -> Concat IV + Cipher = IvAndCipherBase64
    28. return Convert.ToBase64String(IvBytes.Concat(cipherBytes).ToArray());
    29. }
    30. public string Decrypt(string IvAndCipherBase64)
    31. {
    32. if (string.IsNullOrEmpty(IvAndCipherBase64))
    33. return "";
    34. //Decrypt
    35. using Aes aesSecure = Aes.Create();
    36. //Split: IV+CipherBase64
    37. byte[] IvAndCipherBytes = Convert.FromBase64String(IvAndCipherBase64);
    38. byte[] IvBytes = IvAndCipherBytes.Take(aesSecure.IV.Length).ToArray();
    39. byte[] CipherBytes = IvAndCipherBytes.Skip(aesSecure.IV.Length).ToArray();
    40. aesSecure.Key = SecureSecretKeyBytes;
    41. aesSecure.IV = IvBytes;
    42. ICryptoTransform decryptor = aesSecure.CreateDecryptor(aesSecure.Key, aesSecure.IV);
    43. using MemoryStream memoryStream = new(CipherBytes);
    44. using CryptoStream cryptoStream = new((Stream)memoryStream, decryptor, CryptoStreamMode.Read);
    45. using StreamReader streamReader = new((Stream)cryptoStream);
    46. return streamReader.ReadToEnd();
    47. }
    48. }


    Einfach ein Instanz der MyAes Class erzeugen. Die enthaltene Encrypt-Methode mit dem gesamten Text der .xml-Datei aufrufen und das Ergebnis speichern.
    Bilder
    • VB_Aes.jpg

      280,85 kB, 998×771, 42 mal angesehen
    codewars.com Rank: 4 kyu

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „nogood“ ()

    Hey, danke für die Antworten! Ich habe das Tut von EDR mir mal vorgeknöpft, damit funktioniert es wunderbar :)

    @nogood Exakt, er speichert es in eine XML. Und da war eben das Problem, dass diese jeder Lesen konnte. Diese ist nun verschlüsselt und nurnoch ein "Byte-Salat" wie es EDR so schön nannte.

    Danke euch :)