AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language XML-Datei zu Stream | Stream zu Hashwert | XML gegen Manipulation schützen
Thema durchsuchen
Ansicht
Themen-Optionen

XML-Datei zu Stream | Stream zu Hashwert | XML gegen Manipulation schützen

Ein Thema von Headbucket · begonnen am 12. Dez 2013 · letzter Beitrag vom 12. Dez 2013
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: XML-Datei zu Stream | Stream zu Hashwert | XML gegen Manipulation schützen

  Alt 12. Dez 2013, 10:36
Erst mal als Grundsatz:

Die Daten komplett in eine Klasse (Container) schreiben.
Diesen Container dann an eine Klasse (ContainerIO) übergeben, die diesen Container speichern und lesen kann.

Jetzt kann eine Klasse (ContainerIO) die Daten aus dem Container in ein XML schreiben und berechnet aus den Daten auch den Hash. Dazu ist es nicht erforderlich die XML-Ausgabe zu hashen, sondern rein die Daten.

Am Ende fügt ContainerIO noch den ermittelten Hashwert in die XML Datei ein.

Beim Einlesen geht das quasi umgekehrt.

ContainerIO liest die Daten ein, bildet den Hashwert (wie schon vorher beim Speichern) und vergleicht diesen Hashwert mit dem aus der XML-Datei.

Stimmt der Hashwert, dann alles ok, ansonsten Exception werfen, oder was auch immer.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Guido R.
Guido R.

Registriert seit: 5. Jul 2007
141 Beiträge
 
Delphi 12 Athens
 
#2

AW: XML-Datei zu Stream | Stream zu Hashwert | XML gegen Manipulation schützen

  Alt 12. Dez 2013, 10:43
Zu Deinem Hashwert-Problem :
Bekommst Du etwas anderes heraus, wenn Du die Position Deines MemoryStreams vor dem ermitteln des Hash-Wertes auf 0 setzt ?
(Kann es gerade nicht selber testen)

Gruß
Guido
  Mit Zitat antworten Zitat
Headbucket

Registriert seit: 12. Dez 2013
Ort: Dresden
172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: XML-Datei zu Stream | Stream zu Hashwert | XML gegen Manipulation schützen

  Alt 12. Dez 2013, 10:55
@Sir Rufo
Inwiefern unterscheidet sich dieses Konzept von meiner ersten Version? Es werden ja dann wieder nur die Werte der einzelnen Attribute gehasht. Generelle Manipulationen an der Struktur der XML-Datei werden somit dann nicht bzw. durch andere Fehler sichtbar. Vllt habe ich dich aber auch falsch verstanden.

Zu Deinem Hashwert-Problem :
Bekommst Du etwas anderes heraus, wenn Du die Position Deines MemoryStreams vor dem ermitteln des Hash-Wertes auf 0 setzt ?
(Kann es gerade nicht selber testen)

Gruß
Guido
Tatsache. Wenn ich die Position vor dem Ermitteln auf 0 setze bekomme ich für unterschiedliche Werte auch unterschiedliche Hashwerte. Was hat er denn dann vorher immer gehasht? Das ist schonmal super - vielen Dank! Dann werde ich jetzt mal versuchen das Einlesen der Daten zu bewerkstelligen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.376 Beiträge
 
Delphi 12 Athens
 
#4

AW: XML-Datei zu Stream | Stream zu Hashwert | XML gegen Manipulation schützen

  Alt 12. Dez 2013, 11:18
Das mit dem Hash in der XML hatte ich auch mal gemacht.

Es gibt da zwei grundsätzliche Wege:

- den XML-Text als kompletten String/Stream haschen
(hierbei muß der Hash vorher durch einen "Dummy"-Wert ersetzt oder entfernt werden, da er ja mitgehasht wird)

- das XML im DOM hashen, also alle Nodes, Values und Attributes durchgehen und deren Werte haschen (dabei den Hash-Node ignorieren)
(hier ist dann die Formatierung des XML-Textes egal und man kann "unwichtige" Werte überspringen, bzw. Teile einzeln/getrennt haschen)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (12. Dez 2013 um 11:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: XML-Datei zu Stream | Stream zu Hashwert | XML gegen Manipulation schützen

  Alt 12. Dez 2013, 11:33
Die Frage ist doch, welche Manipulationen man erkennen möchte:

Original
XML-Code:
<?xml version="1.0"?>
<Root>
   <messdaten>
      <messwerte text="Titel" messwert1="2.5" messwert2="7.6"/>
   </messdaten>
   <hashdaten>
      <hash wert="4b0fbe5ec8db72fe0ffaf8e1cbc9f50f"/>
   </hashdaten>
</Root>
Veränderung (Formatierung) - ist egal und kann durchgewunken werden
XML-Code:
<?xml version="1.0"?>
<Root>
<messdaten><messwerte text="Titel" messwert1="2.5" messwert2="7.6"/></messdaten>
<hashdaten><hash wert="4b0fbe5ec8db72fe0ffaf8e1cbc9f50f"/></hashdaten>
</Root>
Veränderung (Attributnamen) - wird erkannt
XML-Code:
<?xml version="1.0"?>
<Root>
<mAssdaten><mAsswerte tAxt="Titel" mAsswert1="2.5" mAsswert2="7.6"/></mAssdaten>
<hashdaten><hash wert="4b0fbe5ec8db72fe0ffaf8e1cbc9f50f"/></hashdaten>
</Root>
Veränderung (Werte) - wird erkannt
XML-Code:
<?xml version="1.0"?>
<Root>
<messdaten><messwerte text="Titel1" messwert1="2.55" messwert2="7.65"/></messdaten>
<hashdaten><hash wert="4b0fbe5ec8db72fe0ffaf8e1cbc9f50f"/></hashdaten>
</Root>
Veränderung (Metadaten anhängen) - ist für die Messwerte egal - kann durchgewunken werden
XML-Code:
<?xml version="1.0"?>
<Root>
<messdaten><messwerte text="Titel" messwert1="2.5" messwert2="7.6"/></messdaten>
<hashdaten><hash wert="4b0fbe5ec8db72fe0ffaf8e1cbc9f50f"/></hashdaten>
<metadaten><metawert Autor="Ich"/></metadaten>
</Root>
Wenn nur die Messdaten interessant sind, dann braucht man auch nur diese zu hashen, und nicht auch noch die Struktur darum, denn ohne gültige Struktur können die Daten nicht gelesen werden.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Headbucket

Registriert seit: 12. Dez 2013
Ort: Dresden
172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: XML-Datei zu Stream | Stream zu Hashwert | XML gegen Manipulation schützen

  Alt 12. Dez 2013, 12:03
Es gibt da zwei grundsätzliche Wege:

- den XML-Text als kompletten String/Stream haschen
(hierbei muß der Hash vorher durch einen "Dummy"-Wert ersetzt oder entfernt werden, da er ja mitgehasht wird)

- das XML im DOM hashen, also alle Nodes, Values und Attributes durchgehen und deren Werte haschen (dabei den Hash-Node ignorieren)
(hier ist dann die Formatierung des XML-Textes egal und man kann "unwichtige" Werte überspringen, bzw. Teile einzeln/getrennt haschen)
Genau diese Dinge werde ich wohl intern nochmal mit dem Entwicklungsleiter klären müssen. Als ich heute morgen kurz mit ihm gesprochen habe war er mit meiner ersten Version, wo nur die Werte gehasht werden nicht zufrieden und wollte alles gehasht haben. Da werde ich nochmal die Vor- und Nachteile mit ihm abklären.
Nicht destotrotz ist es sinnvoll diesen Vorarbeits-Thread auch zu kennen.
Das stimmt natürlich .

@Sir Rufo
Meiner Meinung nach hast du recht. Der Aufbau der Struktur sollte keinen Einfluss haben. Es macht dann zwar mehr Arbeit bei der Auswertung aber mal sehen.

Der Vollständigkeit halber hier nochmal beide Prozeduren mit Streams:
Delphi-Quellcode:
procedure TForm1.LiesXML;
var
  xmlDoc: IXMLDocument;
  HashDatei, HashBerechnet: string;
  Stream: TStream;
begin
  //XMLDocument erzeugen und xml-Datei laden
  xmlDoc := newXMLDocument;
  xmlDoc.LoadFromFile(PATH + Dateiname);
  xmlDoc.Active := true;

  TextEdt.Text := xmlDoc.DocumentElement.ChildNodes['messdaten'].ChildNodes['messwerte'].Attributes['text'];
  Messwert1Edt.Text := xmlDoc.DocumentElement.ChildNodes['messdaten'].ChildNodes['messwerte'].Attributes['messwert1'];
  Messwert2Edt.Text := xmlDoc.DocumentElement.ChildNodes['messdaten'].ChildNodes['messwerte'].Attributes['messwert2'];

  HashDatei := xmlDoc.DocumentElement.ChildNodes['hashdaten'].ChildNodes['hash'].Attributes['wert'];

  xmlDoc.DocumentElement.ChildNodes.Remove(xmlDoc.DocumentElement.ChildNodes.FindNode('hashdaten'));

  Stream := TMemoryStream.Create;

  xmlDoc.SaveToStream(Stream);
  Stream.Position := 0;

  HashBerechnet := getMd5StreamToStr(Stream);

  if HashDatei = HashBerechnet then
  begin
    StatusBar1.Panels[1].Text := 'Hash ok!';
  end
  else
  begin
    StatusBar1.Panels[1].Text := 'Hash nicht ok!';
  end;
end;

procedure TForm1.SchreibeXML;
var
  xmlDoc : IXMLDocument;
  iNode: IXMLNode;
  Hashwert: string;
  Stream: TStream;
begin
  ErstelleXML;

  xmlDoc := newXMLDocument;
  xmlDoc.LoadFromFile(PATH + Dateiname);
  xmlDoc.Active := true;

  //Neuen Knoten anlegen - Messdaten
  xmlDoc.DocumentElement.AddChild('messdaten');

  //Attribute zuweisen - Messwerte
  iNode := XMLDoc.DocumentElement.ChildNodes['messdaten'].AddChild('messwerte');
  iNode.Attributes['text'] := TextEdt.Text;
  iNode.Attributes['messwert1'] := Messwert1Edt.Text;
  iNode.Attributes['messwert2'] := Messwert2Edt.Text;
  iNode.Text := '';

  Stream := TMemoryStream.Create;

  xmlDoc.SaveToStream(Stream);
  Stream.Position := 0;

  Hashwert := getMd5StreamToStr(Stream);

  //Neuen Knoten anlegen - Hashdaten
  xmlDoc.DocumentElement.AddChild('hashdaten');

  //Attribute zuweisen - Hashwert
  iNode := XMLDoc.DocumentElement.ChildNodes['hashdaten'].AddChild('hash');
  iNode.Attributes['wert'] := Hashwert;
  iNode.Text := '';

  //Speichern
  xmlDoc.SaveToFile(PATH + Dateiname);
end;
Ich werde mich ggf. nochmal melden, wenn ich das Verfahren geklärt habe. Vielen Dank schonmal für die schnelle und gute Hilfe!

Grüße
Headbucket
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.376 Beiträge
 
Delphi 12 Athens
 
#7

AW: XML-Datei zu Stream | Stream zu Hashwert | XML gegen Manipulation schützen

  Alt 12. Dez 2013, 12:22
Man kann vor dem Haschen die XML nochmal "neu" formatiert in einen String/Stream kopieren und da hashen (den Hash entfernt/ersetzt).
Da wäre die Formatierung auch fast egal, abgesehn von der Groß-/Kleinschreibung, denn XML ist grundsätzlich erstmal CaseInsensitiv und auch die Reihenfolge der Parameter könnte interessant sein, welche ja praktisch auch egal ist, aber beim Haschen kommt es dann wieder auf die Reihenfolge drauf an.

Je nach Auswertung könnte auch die Reihenfolge der Nodes egal sein.

Auch kann ein Node so <node></node> oder <node /> gespeichert sein, was aber vom Inhalt, bzw. aus Sicht des DOMs nahezu egal ist.

Und womöglich kann für die Auswertung auch egal sein, ob ein leerer Node vorhanden ist oder nicht.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (12. Dez 2013 um 12:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: XML-Datei zu Stream | Stream zu Hashwert | XML gegen Manipulation schützen

  Alt 12. Dez 2013, 12:56
Wäre es bei diesem aufwand nicht vllt. einfacher einen (verschlüselte) Zip-Datei mit den XML-Daten zu erstellen und vor Programmstart, diese zu entpacken?

oder aber die Daten gleich Binär speichern, und dort einen Hash dazu packen. GGf. kann man ja für Neugierige dann noch eine xml-Datei generieren.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: XML-Datei zu Stream | Stream zu Hashwert | XML gegen Manipulation schützen

  Alt 12. Dez 2013, 13:03
Wäre es bei diesem aufwand nicht vllt. einfacher einen (verschlüselte) Zip-Datei mit den XML-Daten zu erstellen und vor Programmstart, diese zu entpacken?

oder aber die Daten gleich Binär speichern, und dort einen Hash dazu packen. GGf. kann man ja für Neugierige dann noch eine xml-Datei generieren.

Gruß
K-H
Das ist doch durch die Brust ins Auge und wieder zum Ohr rein.

Wenn ich aus einer wie auch immer gearteten Datei eine Datenstruktur auslesen kann, die vom Daten-Inhalt her identisch ist, dann sind die Daten unverändert.

So kann diese Datei dann auch in ein JSON, YAML, Ini, etc. Format überführt werden (inkl. dem Hashwert) und die Daten können zuverlässig auf Unversehrtheit/Änderung geprüft werden.

Darum würde ich in einen Hash niemals die Speicherstruktur aufnehmen, wenn es mir um die Daten geht.

Bei einem EAN13 Barcode wird ja auch nicht die Strichbreite, Höhe, Druckfarbe oder Papierart in der Prüfziffer berücksichtigt. Auch nicht der Karton, wo der dran draufklebt
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (12. Dez 2013 um 13:05 Uhr)
  Mit Zitat antworten Zitat
madas

Registriert seit: 9. Aug 2007
207 Beiträge
 
#10

AW: XML-Datei zu Stream | Stream zu Hashwert | XML gegen Manipulation schützen

  Alt 12. Dez 2013, 13:34
Nur mal so am Rande: Wenn jemand eine Stelle im Hash ändert und die Messwerte nicht manipuliert, dann schlägt Deine Prüfung trotzdem fehl, obwohl die Messwerte noch korrekt sind.

Ich würde es daher auch wie p80286 machen und die XML-Datei in eine passwortgeschützte ZIP-Datei schmeißen und Ruhe ist. Das Passwort ist in geeigneter Form (nicht MD5) zu hinterlegen.

madas
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz