Benutzer mit den meisten Antworten
Entschlüsseln eines Feldes aus einem Dataset

Frage
-
Salü alle zusammen
Ich habe Daten in eine Datenbank geschrieben und dabei ein Feld verschlüsselt. Dies habe ich folgendermassen gemacht:
string SQL = "INSERT INTO tblBericht ("; SQL += "KeyDatum,KeyWert"; SQL += ")VALUES("; SQL += "'" + myKeyDatum + "',"; SQL += "'" + Verschluesseln(myKeyWert) + "'"; SQL += ")"; con.Open(); sdaStat.InsertCommand = new SqlCommand(SQL, con); sdaStat.InsertCommand.ExecuteNonQuery();
Jetzt möchte ich die Daten wieder lesen. Das mache ich wie folgt:
public DataTable GetKeyDaten() { string ConString = getConString(); string ConStrName = getConStrName(); string SQL = "SELECT KeyDatum,KeyWert FROM tblBericht"; DataTable dt = new DataTable(); ConString = ConfigurationManager.ConnectionStrings[ConStrName].ConnectionString; SqlDataAdapter sda; using (SqlConnection con = new SqlConnection(ConString)) { SqlCommand cmd = new SqlCommand(SQL, con); sda = new SqlDataAdapter(cmd); dt = new DataTable("tblBericht"); sda.Fill(dt); } return dt; }
Die so gewonnene DataTable dt verwende ich zum Beispiel als DataSource bei einem DataGrid. Nur wird mir dort jetzt natürlich die Spalte KeyWert verschlüsselt angezeigt, was logisch ist.
Nur weiss ich jetzt nicht, wie ich die Funktion Entschluesseln(...) einbauen soll, so dass mir das in der Datenbank verschlüsselte Feld keyWert auch wieder entschlüsselt wird.
Kann mir bitte jemand helfen und mir sagen, wie ich die in der DataTable dt befindliche Spalte KeyWert mit meiner Funktion Entschlüsseln(string CryptString) entschlüsseln kann?
Viele liebe Grüsse
Sabrina
Antworten
-
So ist es nicht schlimm o.ä. mit den 2 Fragen, da diese sich nach der Erklärung unterscheiden.
Das DataTable ist in WinForms und WPF das gleiche, ich sehe jedoch ein Problem darin, das das "System" mit den Datenbindungen unterschiedlich funktioniert. Wärend es in WinForms das Format-Event gibt, braucht man in WPF halt eine Konverter-Klasse.
Zum SQL:
Mal angenommen dir wird eine "ID" übergeben, anhand derer du nun ein DataSet aus der SB laden sollst. Nortmalerweise könnte man es so machen:
"SELECT * FROM Table WHERE ID LIKE '" + ID" + "'"
Ein Parameter beginnt mit einem @. Wenn du nun also @ID abfragen willst, dann sieht das so aus:
"SELECT * FROM Table WHERE ID LIKE @ID"
Den Parameter @ID kannst du dann ganz einfach so hinzufügen:
using (SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand command = new SqlCommand(commandText, connection); command.Parameters.Add("@ID", SqlDbType.Int); command.Parameters["@ID"].Value = myIDValue;//Den Wert zuweisen
Du musst also anstelle der Werte, Parameter einfügen. Den Parametern weißt du dann erst den Wert zu. Dadurch werden Zeichenfolgen, welche Fehler verursachen würden, kodiert, damit nichgts mehr passieren kann. Eigentlich sollte man es auch dynamisch gestalten können. Wie es in deinem speziellen Fall geht kann ich dir aber ni9cht ohne weitere Infos sagen.
Wenn dua llerdings nicht das einfügen von direkten Werten verhindern kannst, dann wird auch auch kaum im nach hinein zu Parametern umzusetzen gehen.@Peter: Dieses DataGrid kannte ich nicht, danke für die Aufklärung :)
<Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite | Code Beispiele | Facebook | Twitter | Snippets C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Als Antwort markiert Ciprian Bogdan Freitag, 9. August 2013 11:52
Alle Antworten
-
Ich hatte mal ein ähnliches Problem:
Wie kann ich ein über DataBinding gebundenes Control zur Laufzeit entschlüsseln.
Ich bin dann auf folgenden Link gestoßen:
Ich denke, dass lässt sich auch auf ein DataGrid anwenden...
-
Salü oii
Vielen lieben dank für Deinen Link. Habe den studiert. Ich sehe die Idee, anstatt die abgefragten Daten in der DataTable zu ändern, einfach die Anzeige im DataGrid ändern. Aber ich verstehe das was da geschrieben ist nicht wirklich, jedenfalls nicht so, dass ich das umsetzen könnte. Ich finde das Ereignis nicht, wo ich ansetzen muss. Und wo ich dann meine Funktion angeben muss... :-(
Viele Grüsse
Sabrina -
Hallo, warum hast du 2 Fragen dazu gestellt? Der Inhalt der Fragen scheint so ziehmlich der Gleiche zu sein.
http://social.msdn.microsoft.com/Forums/de-DE/354f2c95-db6c-4317-9e59-a02c8185e2a5/wpf-datagrid-spalte-entschlsselnDer von oiiSamiio verlinkte Artikel bezieht sich auch auf Windows Forms, die Frage scheint sich aber auf WPF zu beziehen, da es um ein DataGrid und nicht um eine DataGridView handelt.
Noch ein kleiner Hinweis zu dem obigem SQL: Wenn man einen Befehl auf diese Weise verknüpft, dann ist es meistens recht leicht ein eine SQL Injection durchzuführen. Wenn du dagegen auf Parameter setzt, bist du mehr oder weniger vor dem Problem sicher. Ein kleines Beispiel dazu gibts in diesem Artikel:
http://msdn.microsoft.com/de-de/library/system.data.sqlclient.sqlcommand.parameters.aspx<Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite | Code Beispiele | Facebook | Twitter | Snippets C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Hi Tom,
im Framework gibt es auch ein DataGrid für Windows Oberflächen. Es ist sehr schnell, erlaubt die Navigation zwischen Tabellen eines DataSets. Für Testzwecke ist es sehr gut geeignet. Die Möglichkeiten der Anpassung sind jedoch begrenzt und nicht vergelichbar mit dem DataGridView oder den WPF-DataGrid.--
Peter -
Salü Koopakiller
>warum hast du 2 Fragen dazu gestellt?
Weil ich vorgestern hier das Problem beim lesen der Daten vom SQL Server gesucht habe. Und das wäre eine Frage zur Datenbank und zum Lesen aus der Datenbank oder DataTable.
Dann habe ich aufgrund der gestrigen Antwort die Idee gehabt, dass man das Problem anstatt bei der DataTable auch bei der WPF lösen könnte. Und das hat ja dann nichts mehr mit der DataTable zu tun sondern eben viel mehr mit WPF. Daher dachte ich, dass die Fragestellung nach dem Bind bei WPF besser aufgehoben ist als hier. Vor allem, weil ich die hiesige Antwort nicht in der Lage bin umzusetzen.
Verzeih mir, dass ich mein Problem über verschiedene Wege, einmal Bind bei WPF und einmal DataTable bei SQL zu lösen versuche.
>Der von oiiSamiio verlinkte Artikel bezieht sich auch auf Windows Forms
Richtig, aber wie oiiSamiio richtig erwähnt, kann man WinForm und WPF Objekte beide mit einer DataTable füttern. Und da ich geglaubt habe, dass ich die in der DataTable verschlüsselte spalte ersetzen könnte, ist seine Idee ja nicht wirklich schlecht, oder? Oder ist die DataTable für WinForm eine andere als die für WPF?
>Hinweis zu dem obigem SQL ... SQL Injection
Diesen hinweis finde ich sehr gut. Das stellt mich aber vor eine ganze Reihe Probleme. Der SQL String wird irgendwo im BL generiert und dann mehrfach übergeben bis er im DL endlich ausgeführt wird. Wenn ich also einen SQL String geliefert bekomme, wie baue ich diesen dann zu Parametern um? Muss ich den wieder zerteilen?
Viele liebe Grüsse
Sabrina -
So ist es nicht schlimm o.ä. mit den 2 Fragen, da diese sich nach der Erklärung unterscheiden.
Das DataTable ist in WinForms und WPF das gleiche, ich sehe jedoch ein Problem darin, das das "System" mit den Datenbindungen unterschiedlich funktioniert. Wärend es in WinForms das Format-Event gibt, braucht man in WPF halt eine Konverter-Klasse.
Zum SQL:
Mal angenommen dir wird eine "ID" übergeben, anhand derer du nun ein DataSet aus der SB laden sollst. Nortmalerweise könnte man es so machen:
"SELECT * FROM Table WHERE ID LIKE '" + ID" + "'"
Ein Parameter beginnt mit einem @. Wenn du nun also @ID abfragen willst, dann sieht das so aus:
"SELECT * FROM Table WHERE ID LIKE @ID"
Den Parameter @ID kannst du dann ganz einfach so hinzufügen:
using (SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand command = new SqlCommand(commandText, connection); command.Parameters.Add("@ID", SqlDbType.Int); command.Parameters["@ID"].Value = myIDValue;//Den Wert zuweisen
Du musst also anstelle der Werte, Parameter einfügen. Den Parametern weißt du dann erst den Wert zu. Dadurch werden Zeichenfolgen, welche Fehler verursachen würden, kodiert, damit nichgts mehr passieren kann. Eigentlich sollte man es auch dynamisch gestalten können. Wie es in deinem speziellen Fall geht kann ich dir aber ni9cht ohne weitere Infos sagen.
Wenn dua llerdings nicht das einfügen von direkten Werten verhindern kannst, dann wird auch auch kaum im nach hinein zu Parametern umzusetzen gehen.@Peter: Dieses DataGrid kannte ich nicht, danke für die Aufklärung :)
<Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite | Code Beispiele | Facebook | Twitter | Snippets C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Als Antwort markiert Ciprian Bogdan Freitag, 9. August 2013 11:52
-
Guten Morgen Koopakiller
Deine Worte haben mein Hirn zum Nachdenken angeregt und ich denke mir, ich werde anstelle eines SQL String ein Objekt übergeben.
An der Stelle, an welcher ich das doch eher mühsame INSERT zusammen bastle, kann ich ja ein Objekt definieren welches so ungefähr aussehen könnte:
objSQL.Typ:INSERT oder UPDATE;
objSQL.Tabelle = tblPatienten;
objSQL.Werte.1.Typ = string;
objSQL.Wert.1.Name = "PatName";
objSQL.Werte.1.Wert = "Meier";
objSQL.Werte.1.Typ = int;
objSQL.Werte.2.Name = "PLZ";
objSQL.Werte2.Wert = "8000";
Und das kann ich dann ja durch den ganzen Code hindurch schleppen/übergeben/verweisen und wo gegeben auf einfachste Weise mit einem zusätzlichen Wert objSQL.Wert.Add(String,Ort,Zürich) ergänzen und dort wo es dann ausgeführt wird, erst richtig zu einem SQL String mit Parametern zusammen bauen.
Vielen lieben Dank, dass Du mir zu besserem Code verholfen hast.
Herzliche Grüsse
Sabrina