Laden...

DataSet ver- und entschlüsseln / (de)komprimieren

Erstellt von Jabi vor 16 Jahren Letzter Beitrag vor 15 Jahren 11.064 Views
J
Jabi Themenstarter:in
222 Beiträge seit 2006
vor 16 Jahren
DataSet ver- und entschlüsseln / (de)komprimieren

Beschreibung:

Einfache statische Methode mit der man ein DataSet verschlüsseln und entschlüsseln kann.


using System;
using System.Data;
using System.IO;
using System.IO.Compression;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Cryptography;


public class DataConvert
{
    public static DataSet SecureDataSet(DataSet ds, String password)
    {
        ds.RemotingFormat = SerializationFormat.Binary;
        if (ds.ExtendedProperties.ContainsKey("PackedData"))  // Deomprimieren
        {
            byte[] buffer = new byte[4096];
            int read;
            byte[] ba = Convert.FromBase64String(ds.ExtendedProperties["PackedData"] as string);
            MemoryStream ms = new MemoryStream(ba);
            if (ds.ExtendedProperties.ContainsKey("Encrypted")) // Verschlüsselt 
            {
                if (password == null) throw (new Exception("Access Denied !"));
                if (password == "") throw (new Exception("Access Denied !"));

                RijndaelManaged RMCrypto = new RijndaelManaged();
                CryptoStream CryptStream = new CryptoStream(ms, RMCrypto.CreateDecryptor(CreateKey(password), new Byte[16]), CryptoStreamMode.Read);
                MemoryStream ms1 = new MemoryStream();
                try
                {
                    do
                    {
                        read = CryptStream.Read(buffer, 0, buffer.Length);
                        ms1.Write(buffer, 0, read);
                    }
                    while (read > 0);
                }
                catch (Exception)
                {
                    throw (new Exception("Access Denied !"));
                }
                CryptStream.Close();
                ms = ms1;
                ms.Seek(0, 0);
            }
            DeflateStream dfs = new DeflateStream(ms, CompressionMode.Decompress, true);
            ds.ExtendedProperties.Clear();
            MemoryStream ms2 = new MemoryStream();
            do
            {
                read = dfs.Read(buffer, 0, buffer.Length);
                ms2.Write(buffer, 0, read);
            }
            while (read > 0);
            dfs.Close();
            ms2.Seek(0, 0);
            return (DataSet)(new BinaryFormatter()).Deserialize(ms2, null);
        }
        else  // Komprimieren
        {
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            bf.Serialize(ms, ds);
            byte[] ba = ms.ToArray();
            ms.SetLength(0);
            DeflateStream dfs = new DeflateStream(ms, CompressionMode.Compress);
            dfs.Write(ba, 0, ba.Length);
            dfs.Flush();
            dfs.Close();
            dfs.Dispose();
            ds.Clear();
            ba = ms.ToArray();
            if (password != "")
            {
                ds.ExtendedProperties.Add("Encrypted", true);
                RijndaelManaged RMCrypto = new RijndaelManaged();
                ms = new MemoryStream();
                CryptoStream CryptStream = new CryptoStream(ms, RMCrypto.CreateEncryptor(CreateKey(password), new Byte[16]), CryptoStreamMode.Write);
                CryptStream.Write(ba, 0, ba.Length);
                CryptStream.Close();
                ms.Close();
                ba = ms.ToArray();
            }
            ds.ExtendedProperties.Add("PackedData", Convert.ToBase64String(ba));
        }
        return ds;
    }

    private static byte[] CreateKey(String password)
    {
        PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, null);
        pdb.HashName = "SHA512";
        return pdb.GetBytes(16);
    }
}

Schlagwörter: <DataSet, verschlüsseln, crypt, Secure DataSet, Kompriemieren, dekompriemieren,pack>

J
Jabi Themenstarter:in
222 Beiträge seit 2006
vor 16 Jahren

das DataSet sieht dann so aus wenns verschlüsselt ist:


<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:msprop="urn:schemas-microsoft-com:xml-msprop">
    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true" msprop:Encrypted="True" msprop:PackedData="siehe Anmerkung">
      <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="AutoLoginData">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="ID" msdata:AutoIncrement="true" type="xs:int" />
                <xs:element name="AutoLogin" type="xs:boolean" />
                <xs:element name="GroupMail" type="xs:string" />
                <xs:element name="Password" type="xs:string" default="" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:choice>
      </xs:complexType>
      <xs:unique name="Constraint1" msdata:PrimaryKey="true">
        <xs:selector xpath=".//AutoLoginData" />
        <xs:field xpath="ID" />
      </xs:unique>
    </xs:element>
  </xs:schema>
</NewDataSet>

[EDIT von herbivore]
Anmerkung:

Die gepackten Daten sind ein langer String, den ich hier auf 72 Zeichen umgebrochen habe, damit das Foren-Layout nicht zerrissen wird. Wenn man die XML-Datei verwenden will, muss man ihn wieder zusammenhängen und oben bei "siehe Anmerkung" einfügen.

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

[/EDIT]

Gelöschter Account
vor 16 Jahren

hallo Jabi,

erstmal gute arbeit 👍 👍. ich habe es mir gleich mal in meine linksammlung aufgenommen.

ein paar unwesentliche kleinigkeiten möchte ich hier dennoch erwähnen.

1.

if (password == null) throw (new Exception("Access Denied !"));
                    if (password == "") throw (new Exception("Access Denied !"));

da gibt es z.b.

if (string.IsNullOrEmpty(password)) throw (new Exception("Access Denied !"));
  1. im else block machst du keine überprüfung auf password != null
    (allgemein würde ich gleich am methodenanfang prüfen ob beide argumente passen)

return pdb.GetBytes(16);

getbytes ist depricated.

  1. du wirfst im allgemeinen eine exception. ich persönlich würde eine CryptographicException erwarten.
    genauso sollte nicht in der message access denied kommen, wenn man ausversehend kein passwort mitgeschickt hat. da würde ich in der message erwarten das das passwort fehlt.

ms.SetLength(0);

warum das? und weiterhin gibst du den stream nicht frei (kein close)

  1. allgemein ein wenigmehr mit using wäre praktischer.

  2. im else block:

ms = new MemoryStream();

der vorhergehende ms wurde nicht geschlossen und freigegeben.

8.

ms.Seek(0, 0);

wenn ich das richtig verstehe , dann setzt du nur die position auf 0
also:

ms.Position = 0;
  1. im if-block liest du aus dem cryptstream, schreibst es komplett in ein memorystream, den du dann von einem deflatestream ausließt um das ergebniss in ein memorystream zu schreiben, den du dann wiederum durch den binaryformatter jagst (der liest ja auch streams)

das ist ein wenig umständlich. was spricht dagegen die memorystreams in diesem block wegzulassen?

  1. wenn du neue streams erstellst, dann ist dir zu dem zeitpunkt meistens bekannt, welche größe diese haben müssen.
    perfomant wäre, wenn man gleich bei der erstellung die größe mitgibt, weil ansonsten immer nur stückchenweise allokiert wird.

ok es sind ein paar mehr geworden, als ich anfangs dachte (die 10 gebote ^^). bis auf die freigabe der streams ist aber nichts wirklich wichtiges dabei.

J
Jabi Themenstarter:in
222 Beiträge seit 2006
vor 16 Jahren

hallo,

ja ist nicht perfect ich hab die methode aber auch vor ca nem jahr geschrieben und habe auch erst so ca vor 1.5 jahren angefangen mit c# 🙂

deswegen auch nicht so perfekt

3.430 Beiträge seit 2007
vor 16 Jahren

Hi,

erstmal möchte ich mich auch für dein sehr nützliches CodeSnippet bedanken 👍 👍 👍

ja ist nicht perfect ich hab die methode aber auch vor ca nem jahr geschrieben und habe auch erst so ca vor 1.5 jahren angefangen mit c#

deswegen auch nicht so perfekt

Ja, so geht es jeden. Auch ich denke mir jetzt oft wie geistesbeschränkt ich damals war, als ich ein Codesnippet vor einem halben Jahr geschrieben habe. Denn besonders als Prorgammierer ist die Erfahrung und das Fachwissen extrem wichtig und um diese zu erlangen braucht man halt ein paar Jahre. 🙂

vielen Dank

mfg
MichlG

5.299 Beiträge seit 2008
vor 16 Jahren

Hi Jabi!

Kannich ja mal wieder gegende TryCatcherei zu Felde ziehen:
Einfach weglassen, dann wäre dein Code bischen kürzer, bischen leserlicher, und du würdest auch Exceptions kriegen, wohl sogar genauere, als die du selber definiert hast.

Von Peter Bucher habich'n guten (findich) Link zum Thema gekriegt.

Der frühe Apfel fängt den Wurm.

T
574 Beiträge seit 2008
vor 15 Jahren

hab mir erlaubt das für meine Zwecke zu verwenden und dabei halt noch versucht ein paar der Anmerkungen einzubauen, hier also eine etwas verbesserte Variante:


    public class DataSetUtilities
    {
        public static DataSet SecureDataSet(DataSet ds, String password)
        {
            if (ds == null)
                throw new ArgumentException("Argument ds may not be null");
            if (String.IsNullOrEmpty(password))
                throw new ArgumentException("Argument password may not be null");

            ds.RemotingFormat = SerializationFormat.Binary;
            if (ds.ExtendedProperties.ContainsKey("PackedData"))  // Dekomprimieren
            {
                byte[] buffer = new byte[4096];
                int read;
                byte[] ba = Convert.FromBase64String(ds.ExtendedProperties["PackedData"] as string);
                MemoryStream ms = new MemoryStream(ba);
                if (ds.ExtendedProperties.ContainsKey("Encrypted")) // Verschlüsselt
                {
                    RijndaelManaged rmCrypto = new RijndaelManaged();
                    CryptoStream cryptStream = new CryptoStream(ms, rmCrypto.CreateDecryptor(CreateKey(password), new Byte[16]), CryptoStreamMode.Read);
                    MemoryStream ms1 = new MemoryStream();
                    try
                    {
                        do
                        {
                            read = cryptStream.Read(buffer, 0, buffer.Length);
                            ms1.Write(buffer, 0, read);
                        }
                        while (read > 0);
                        cryptStream.Close();
                        cryptStream.Dispose();
                    }
                    catch (Exception)
                    {
                        throw new SecurityException("Access Denied!");
                    }
                    finally
                    {
                        ms.Close();
                        ms.Dispose();
                    }
                    ms = ms1;
                    ms.Seek(0, 0);
                }
                DeflateStream dfs = new DeflateStream(ms, CompressionMode.Decompress, true);
                ds.ExtendedProperties.Clear();
                MemoryStream ms2 = new MemoryStream();
                do
                {
                    read = dfs.Read(buffer, 0, buffer.Length);
                    ms2.Write(buffer, 0, read);
                }
                while (read > 0);
                dfs.Close();
                ms2.Seek(0, 0);
                DataSet result = (DataSet)(new BinaryFormatter()).Deserialize(ms2, null);
                ms2.Close();
                ms2.Dispose();
                dfs.Dispose();
                ms.Close();
                ms.Dispose();
                return result;
            }
            else  // Komprimieren
            {
                BinaryFormatter bf = new BinaryFormatter();
                MemoryStream ms = new MemoryStream();
                bf.Serialize(ms, ds);
                byte[] ba = ms.ToArray();
                ms.SetLength(0);
                DeflateStream dfs = new DeflateStream(ms, CompressionMode.Compress);
                dfs.Write(ba, 0, ba.Length);
                dfs.Flush();
                dfs.Close();
                dfs.Dispose();
                ds.Clear();
                ba = ms.ToArray();
                ds.ExtendedProperties.Add("Encrypted", true);
                RijndaelManaged rmCrypto = new RijndaelManaged();
                ms.Close();
                ms.Dispose();
                ms = new MemoryStream();
                CryptoStream cryptStream = new CryptoStream(ms, rmCrypto.CreateEncryptor(CreateKey(password), new Byte[16]), CryptoStreamMode.Write);
                cryptStream.Write(ba, 0, ba.Length);
                cryptStream.Close();
                cryptStream.Dispose();
                ms.Close();
                ms.Dispose();
                ba = ms.ToArray();
                ds.ExtendedProperties.Add("PackedData", Convert.ToBase64String(ba));
            }
            return ds;
        }

        private static byte[] CreateKey(String password)
        {
            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
            PasswordDeriveBytes pdb = new PasswordDeriveBytes(password,createRandomSalt(8));
            return pdb.CryptDeriveKey("TripleDES", "SHA1", 192, tdes.IV);
        }


        //********************************************************
        //* Helper methods:
        //* createRandomSalt: Generates a random salt value of the 
        //*                   specified length.  
        //*
        //* clearBytes: Clear the bytes in a buffer so they can't 
        //*             later be read from memory.
        //********************************************************
        /// <summary>
        /// <see cref="ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.de/cpref11/ html/T_System_Security_Cryptography_PasswordDeriveBytes.htm"/>
        /// </summary>
        private static byte[] createRandomSalt(int Length)
        {
            // Create a buffer
            byte[] randBytes;

            if (Length >= 1)
            {
                randBytes = new byte[Length];
            }
            else
            {
                randBytes = new byte[1];
            }

            // Create a new RNGCryptoServiceProvider.
            RNGCryptoServiceProvider rand = new RNGCryptoServiceProvider();

            // Fill the buffer with random bytes.
            rand.GetBytes(randBytes);

            // return the bytes.
            return randBytes;
        }

        /// <summary>
        /// <see cref="ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.de/cpref11/ html/T_System_Security_Cryptography_PasswordDeriveBytes.htm"/>
        /// </summary>
        private static void clearBytes(byte[] Buffer)
        {
            // Check arguments.
            if (Buffer == null)
            {
                throw new ArgumentException("Buffer");
            }

            // Set each byte in the buffer to 0.
            for (int x = 0; x <= Buffer.Length - 1; x++)
            {
                Buffer[x] = 0;
            }
        }
    }
J
Jabi Themenstarter:in
222 Beiträge seit 2006
vor 15 Jahren

Super erweiterung Danke !

T
574 Beiträge seit 2008
vor 15 Jahren

Nur mal so als Kennzahl, was ich damit im Moment komprimiere: Wir haben ein WebService laufen, in dem es eine Funktion "Erweiterte Suche" gibt, die relativ viele Daten für Personen zurückliefert und hier ein Beispiel für den Trace:

/19.06.2008 12:18:02:/ ExtendedSearch-Result original size: 100171213
/19.06.2008 12:18:06:/ ExtendedSearch-Result compressed to: 7710830

I
1.739 Beiträge seit 2005
vor 15 Jahren

Der Haken liegt wie immer im Schlüsseltransport...

F
10.010 Beiträge seit 2004
vor 15 Jahren

Und wenn Du das Compressed DataSet von edgehead genommen hättest,
wäre es nocheinmal deutlich kleiner.

Hatte ich vor jahren hier mal gepostet.

http://www.eggheadcafe.com/articles/20040311.asp
Geht sogar mit dem CF.

Edit:
Achso, compress vor dem encrypten, ist allemal besser als andersrum.

T
574 Beiträge seit 2008
vor 15 Jahren

Und wenn Du das Compressed DataSet von edgehead genommen hättest,
wäre es nocheinmal deutlich kleiner.

Hast du da ein verwendbares Beispiel? Hab da grad was downgeloaded und das wird zwar deutlich kleiner als obiges Beispiel, aber das ist um so vieles langsamer, dass sich das gar nicht mehr rentiert.
Ich hab ein DataSet mit 1776 Zeilen, Uncompressed: ca 2.MB, mit "unserem" Code auf 200K herunter, mit dem PAB.CompressDataSet.Wrapper zwar auf 65K herunter, dafür dauert allein das Compress mit dem PAB schon 1.5 Sekunden, wo ich bei unserem Code nur etwa 200ms brauche.

Edit:
Achso, compress vor dem encrypten, ist allemal besser als andersrum.

Wie ist das gemeint? Das wird doch eh so gemacht ...

Edit:
Ich hab bei mir noch eine zusätzliche Stufe eingebaut, die außerdem vor dem Komprimieren, die Spaltennamen auf "A","B","C" ... umbaut, sodass nicht die ganzen Spaltennamen übertragen werden. Das allein bringt im Schnitt nochmal etwa 1/3 weniger.
Interessanterweise ist das bei der Komprimierung egal.

Uncompressed: 2.391 KB
compressed: 201KB

Uncompressed: 2.391 KB
with columnName-Optimizer: 1.570KB
compressed: 201KB (und sogar ein paar Byte größer), liegt wohl daran, dass ich die Spalteninformation irgendwo im ds speichern muss

F
10.010 Beiträge seit 2004
vor 15 Jahren

Klar dauert das u.U. etwas länger, kommt ja drauf an, wozu du es brauchst.

Und du verschlüsselst erst, dann komprimierst du.
Durch das verschlüsseln wir der text aber deutlich schlechter zu komprimieren.

Darum erst kompress, dann verschlüsseln.

Und natürlich ist es der komprimierung egal, da gleiche Texte ja eben comprimiert werden.

5.299 Beiträge seit 2008
vor 15 Jahren

Hi allerseits!

Nach meiner Erfahrung ist XmlSerialisierung kompakter als binäre Serialisierung, und Dataset.WriteXml() kompakter als XmlSerialisierung.

Und eigentlich müsste man doch MemoryStream, CryptoStream und DeflateStream alle ineinander verschachteln können.

Also man serialisiert oben in den MemoryStream hinein, und unten kommts komprimiert und verschlüsselt (Reihenfolge beachten 😉) wieder raus.

(Aber so richtig blick ich den Code noch nicht - Wie kann ein verschlüsseltes Dataset als Dataset übergeben werden - das ist doch nur noch ein wirrer Haufen Bytes? )

Der frühe Apfel fängt den Wurm.

I
1.739 Beiträge seit 2005
vor 15 Jahren

@ErfinderDesRades
Wie soll das gehen(xml<bin)? Ist das jetzt mit oder ohne Kompr. gemeint(wenn ja welcher?).

5.299 Beiträge seit 2008
vor 15 Jahren

Hmm, jetzt habich nochmal ausprobiert:
XmlSerialisierung: 945KB
Binäre Serialisierung: 727KB
Dataset.WriteXml: 626KB

Naja, die Unterschiede sind nicht so grauenhaft signifikant.
Ich hab mirs binäre File übrigens mal im Editor beguckt: ist auch nur Xml drin.

Gemeint is' ohne alles.

Der frühe Apfel fängt den Wurm.