Einzelnen Beitrag anzeigen

Headbucket

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

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