Standard zum Abspeichern von Prüfsumme/Signatur von Files



  • Ich habe eine Anwendung wo ich eine Prüfsumme über eine Datei + eine Signatur über die Datei (bzw. über eben diese Prüfsumme) irgendwie aus einem anderen File auslesen muss.

    Welche Prüfsumme, wie signiert wird etc. kann ich mir alles aussuchen. Implementiert werden muss alles in C#.
    Möglichkeiten für welche Prüfsumme, wie signieren etc. kenne ich genügend (dazu gibt es ja auch haufenweise Beispiele im Netz). In ein XML/JSON/INI File speicher und wieder auslesen wäre auch nicht das Problem. Grundsätzlich alles kein Ding.

    Bloss: ich will das Rad nicht neu erfinden wenn es nicht nötig ist. Am liebsten wäre mir wenn ich dazu irgend ein Standardformat verwenden könnte. Und zwar wenn möglich ein menschenlesbares mit gutem Tool-Support (Libraries + fertige Commandline-Tools).

    Also quasi sowas wie .SFV, nur mit stärkerer Prüfsumme und der Möglichkeit eine Signatur dazuzupacken.

    Gibt es da etwas?

    Bzw. alternativ, falls es sowas nicht gibt: gibt es vielleicht getrennte Standardformate?



  • Du könntest MD5 Checksums sowie Windowszertifikate zur Integritätsprüfung nehmen. Beides lässt sich über C# recht einfach verwenden.
    Wäre das eine Möglichkeit?



  • Führen die paar Zeilen wirklich schon zu TL;DR?

    hustbaer schrieb:

    Möglichkeiten für welche Prüfsumme, wie signieren etc. kenne ich genügend (dazu gibt es ja auch haufenweise Beispiele im Netz). In ein XML/JSON/INI File speicher und wieder auslesen wäre auch nicht das Problem. Grundsätzlich alles kein Ding.



  • hustbaer schrieb:

    Führen die paar Zeilen wirklich schon zu TL;DR?

    Ich verstehe das Problem nicht, es hat beides sowohl Tools als auch C# Unterstützung. 😕

    Für eine bloße Checksum kannst du eine MD5 in eine Datei schreiben, ist meiner Meinung nach nicht ungewöhnlich.
    Für die Signatur fällt mir sonst nur noch GnuPG ein, aber einzige Manko hierbei ist dass es keineswegs menschenlesbar ist.

    Ich denke es geht eher darum dass es einfach einzusetzen ist und um Fehler zu vermeiden, richtig?
    Im übrigen, wenn es eine Bibliothek gibt und du diese verwenden kannst, sollte es doch auch kein Problem sein eigene Kommandozeilen Tools zu machen.



  • Was bringt es mir wenn du mir schreibst dass ich etwas machen kann, von dem ich bereits geschrieben habe dass ich weiss dass ich und wie ich es machen kann?

    DarkShadow44 schrieb:

    Im übrigen, wenn es eine Bibliothek gibt und du diese verwenden kannst, sollte es doch auch kein Problem sein eigene Kommandozeilen Tools zu machen.

    Ja. Ich weiss.
    Welchen Punkt meiner Frage beantwortet das?

    Wenn es kein geeignetes Format gibt, dann werde ich genau das machen. Dazu brauche ich deine Hilfe nicht. Wie viel Aufwand das ist oder nicht ist weiss ich auch selbst, dazu brauche ich keine Belehrung.
    Der Gesamtaufwand einer Selbststrick-Lösung ist einfach um ein vielfaches höher als schnell ein paar Zeilen C# wo hinzuklatschen, Play zu drücken und sich zu freuen dass "es geht".
    Und da ich mir dachte dass diese Sache so oft benötigt wird dass es dafür eigentlich ein Standardformate/Standardtools geben müsste, frage ich hier nach.

    Ich verstehe nicht wieso bei Fragen dieser Art immer so sinnfreie Antworten kommen 😕

    EDIT: Tippfehler korrigiert.



  • hustbaer schrieb:

    Und da ich mir dachte dass diese Sache so oft benötigt wird dass es dafür eigentlich ein Ftandardformate/Standardtools geben müsste, frage ich hier nach.

    Nun, ich bin eher der Meinung dass das sehr spezielle Ansprüche sind.
    Wie gesagt, PGP falls du das noch nicht in Erwägung gezogen hast, mehr fällt mir aber dazu nicht ein. Wenn dir das nicht Standardformat genug ist kann ich dir nicht helfen.

    hustbaer schrieb:

    Ich verstehe nicht wieso bei Fragen dieser Art immer so sinnfreie Antworten kommen 😕

    Nun, du hast gefragt, ich habe gesagt was ich dazu kenne. Ich kann ja nicht ahnen was du schon kennst. 😉
    Kein Grund unhöflich zu werden, wenn du meine Hilfe nicht willst halte ich mich raus.



  • {Unabsichtlich abgeschickt, sorry}



  • Ich hatte gedacht dass ich ausreichend gut klar gemacht hatte was ich suche/brauche und was nicht. Vielleicht hab ich mich da einfach getäuscht und muss das nächste mal noch besser aufpassen mich verständlich auszudrücken. (Wobei das dann meist leider wirklich in TL;DR endet, weil ich entweder kurz oder eindeutig kann, aber kaum jemals beides.)

    DarkShadow44 schrieb:

    Nun, ich bin eher der Meinung dass das sehr spezielle Ansprüche sind.

    Echt jetzt? Du hattest noch nie den Fall wo du neben ein File ein zweites legen wolltest über das du (unabhängig voneinander) prüfen kannst ob a) das erste File beschädigt ist und b) beide Files von jemandem kommen der im Besitz eines bestimmten Zertifikats ist ...?
    Ich hatte den Fall schon öfters dass das sehr praktisch gewesen wäre. Nur noch nie unbedingt nötig, und daher haben wir noch keinen passenden Code und/oder internen Standard wie wir sowas handeln.

    Bin ich denn der einzige der bestimmte Files signieren möchte und dann prüfen können ob die Signatur passt (und unabhängig davon die Checksumme)? Kann ich mir grad gar nicht vorstellen. Ich glaube eher dass sich da jeder was selbst strickt. Was mMn. nicht sinnvoll ist.

    DarkShadow44 schrieb:

    Wie gesagt, PGP falls du das noch nicht in Erwägung gezogen hast, mehr fällt mir aber dazu nicht ein. Wenn dir das nicht Standardformat genug ist kann ich dir nicht helfen.

    Ich verstehe nicht ganz wie ich PGP hier einsetzen soll.
    Ich habe keine Emails und ich habe auch nicht Nutzdaten und Prüfsumme/Signatur in einem File. Und ich will auch nix verschlüsseln.



  • hustbaer schrieb:

    DarkShadow44 schrieb:

    Wie gesagt, PGP falls du das noch nicht in Erwägung gezogen hast, mehr fällt mir aber dazu nicht ein. Wenn dir das nicht Standardformat genug ist kann ich dir nicht helfen.

    Ich verstehe nicht ganz wie ich PGP hier einsetzen soll.
    Ich habe keine Emails und ich habe auch nicht Nutzdaten und Prüfsumme/Signatur in einem File. Und ich will auch nix verschlüsseln.

    Ähm. Ich glaube, mit PGP kann man eine Signatur (anhand deines privaten Schlüssels) der wichtigen Datei machen. Und jeder kann (anhand deines öffentlichen Schlüssels) zuverlässig prüfen, ob die wichtige Datei unverändert ist und ob die Signatur mit deinem und keinem anderen privaten Schlüssel erstellt wurde.
    Manche Linux-Distris erlauben zum Beispiel so, daß der User prüfen kann, ob die wichtigen Dateien echt von den Hauptentwicklern gesichtet wurden. https://www.gentoo.org/downloads/signatures/

    Das ist halt der Dreh, wenn gegen Angreifer geschützt werden soll, die sowohl die wichtige Datei als auch die Profsummendatei durch selbergemachte ersetzen können (zum Bleistift, Du lädst beide Dateien per Internet von Deinen Webservern und der Angreifer kann Dir ans Kabel und einen Brouter zwischenschalten oder wieauchimmer…) Solange der User deinen öffentlichen PGP-Key nicht genauso ungeprüft holt, ist alles in Butter. Ab dann kann der Angreifer oder Dein (durch lügende DNS-Server verführtes) Prog so viele Versionen der wichtigen Dateien mit Signaturdateien ausprobieren wie er will.



  • Genau darum gegen DNS-Spoofing zu schützen geht es ja.
    Der Anwendungsfall ist konkret:
    * Wir haben eine lokal installierte Applikation. Diese wird als authentisch angenommen (denn ist sie das nicht, ist sowieso alles aus).
    * Die lokale Applikation will ein .zip File von URL X ziehen, aber nur wenn sich dieses geändert hat.
    * Die lokale Applikation will dabei sicher gehen dass das .zip File auch wirklich von uns ist.

    Dabei würde ich gerne erstmal ein kleines File vom Server runterladen. Darin soll der Hashcode des aktuellen .zip Files enthalten sein, sowie eine Signatur. Idealerweise eine Signatur die auf einem ganz normalen Zertifikat basiert wie sie z.B. bei SSL (HTTPS, ...) zum Einsatz kommen.

    Nachdem dieses kleine File runtergeladen wurde kann ich dann erstmal den Hashcode prüfen. Wenn der nicht mit dem aktuellen .zip File übereinstimmt, dann lade ich das neue .zip File herunter.
    Danach, egal ob runtergeladen wurde oder nicht, überprüfe ich die Signatur.

    Das Zertifikat (=der Public Key) mit dem die Signatur erstellt wurde ist dabei Teil der lokal installierten Applikation, und wird daher als sicher angenommen.

    Eigentlich ultra-einfach.

    volkard schrieb:

    Ähm. Ich glaube, mit PGP kann man eine Signatur (anhand deines privaten Schlüssels) der wichtigen Datei machen.

    Ah, OK, das kannte ich nicht.
    Das wäre dann quasi die 2. Variante, also getrennte Standards verwenden (1x das sha{X}sum Format für die Prüfsumme und dann ein eigenes File mit einer GPG Signatur).

    Weisst du vielleicht ob GPG auch normale Zertifikate zum Signieren verwenden kann? Idealerweise einfach in Form eines lokal vorliegenden .cer Files.
    Bzw. ob es andere Tools gibt die diesen Fall übernehmen können und statt PGP Keys normale Zertifikate verwenden?



  • Definiere "normale Zertifikate"! openssl?



  • Da wo Webbrowser können.
    X.509 .CER bzw. .PFX/.P12



  • hustbaer schrieb:

    Genau darum gegen DNS-Spoofing zu schützen geht es ja.

    Ok. Treffer.

    hustbaer schrieb:

    Weisst du vielleicht ob GPG auch normale Zertifikate zum Signieren verwenden kann? Idealerweise einfach in Form eines lokal vorliegenden .cer Files.

    "Normal" ist für mich PGP, fürchte ich. 😞

    Aber brauchst ja eh ein PGP für Windows, das wäre dann gpg4win (, was ich selber wegen gpg-agent seit zwei Wochen einsetze auf Arbeit, wegen Windows-Zwang und damit ich stündliche Backups auf meinen Lappy scripten kann (unsere Technikabteilung kann keine time-machine anbieten), die bei Laptopklau der Klauer nicht lesen kann) und gpg4win hat auch den anderen Modus drin, wo man X509-Zertifikate von zum Beispiel www.cacert.org benutzen kann. Falls das die normalen Zertifikate sind? Sie sind windowsig. Und gpg4win riecht danach, als würde es mit diesen oder jenen Zertifikaten gleich laufen.

    (Man muss nicht Admin sein, um pgp4win zu installieren, die *.exe nach *.zip umnennen und die benötigten Files rauskopieren reicht, wenn der Anwalt es erlaubt.)



  • Wobei ich die Lösung denke ich gerade gefunden habe: PKCS#7 (.p7c File, OpenSSL Command Line Utility, System.Security.Cryptography.Pkcs.SignedCms etc.)

    Der mir fehlende Fachbegriff war "detached signature". Damit war es dann relativ flott zu finden.



  • hustbaer schrieb:

    System.Security.Cryptography.Pkcs.SignedCms etc.

    Ach, herrje, das sieht echt angemessen aus.



  • volkard schrieb:

    "Normal" ist für mich PGP, fürchte ich. (...) X509-Zertifikate (...) Falls das die normalen Zertifikate sind? Sie sind windowsig. Und gpg4win riecht danach, als würde es mit diesen oder jeden Zertifikaten gleich laufen.

    Echt jetzt?
    Du surfst nicht quasi jeden Tag über HTTPS? Weder am PC noch am Smartphone?
    Auch keine anderen SSL Protokolle?

    Für mich ist einfach HTTPS das Teil das von der Verbreitung her alles andere in den Schatten stellt. HTTPS basiert auf SSL/TLS, und SSL/TLS verwendet X.509. Daher sind X.509 für micht die "normalen" Zertifikate.



  • volkard schrieb:

    hustbaer schrieb:

    System.Security.Cryptography.Pkcs.SignedCms etc.

    Ach, herrje, das sieht echt angemessen aus.

    Jo. Cool. Hab erst jetzt gesehen: da hab ich sogar eine eigene CheckHash Funktion dabei. Also alles in einem File. 🙂 🙂 🙂

    War mir ja fast sicher dass es hier nen passenden Standard gibt, und ich nur zu doof war den ohne Hilfe zu finden.

    BTW: Danke für den Link! Dadurch bin ich zur Help-Seite für das GPG Command Line Tool gekommen, und dort wiederrum hab ich den mir davor nicht bekannten Begriff "detached signature" aufgeschnappt.



  • Interessant, dass es sogar WinApi Funktionen dafür gibt:

    https://msdn.microsoft.com/en-us/library/windows/desktop/aa381076(v=vs.85).aspx


Log in to reply