checksumme für dateien



  • PAD schrieb:

    Es besteht ein Unterschied ob ich dinge verschlüsseln möchte oder aber Datenintegrität garantieren will.

    MD5 verschlüsselt nicht, sondern erzeugt nur Hashes/Checksummen.
    In /etc/passwd (bzw. in den Shadow Dateien davon) werden bei Linux Systemen nicht die Passwörter, sondern nur die Hashes derselben abgespeichert.

    PAD schrieb:

    Hattest du schon mal regelmäßig Daten im Bereich einiger 100 MBs automatisch zu prüfen (Time is money 😉 )

    Regelmässig noch nicht, aber aus Erfahrung weiss ich dass die Generierung von MD5 Checksummen bei 650MB CD-ROM oder 4,7GB DVD-ROM ISO-Images schon mal eine kleine Weile dauern kann.
    Aber in meinem Fall sollen/müssen es eben MD5 Hashes sein und dann bleibt nur eins: Performance kommt durch Hardware.



  • Descartes schrieb:

    ...und was spricht nochmal gegen die Verwendung von MD5 für die Checksummengenerierung?

    CRC hat mache zauberhafte eigenschaft, die ihn genau gut für integritätstest macht, wenn man davon aus geht, daß fehler gerne als bursts auftreten, das heißt, direkt neben einem fehler ist vielleicht gleich noch ein fehler, dafür drumherum nicht so.
    wo ein bit grund hatte, umzukippen, mag der nachbar mitumgefallen sein, weil die strahlung so groß war, das staubkorn so gruß etc. und irgendwie ist da CRC gut gewappnet dagegen. aber MD5 gar nicht. das hat nen überhaupt anderen zweck. also ist CRC hier schneller UND besser. ist das nicht klasse?



  • Ich frage mich sowieso, warum MD5 von so vielen eingesetzt wird, um eine
    Checksumme zu bilden.

    Das ist nicht Sinn und Zweck von MD5! Genauso wenig ist es Sinn und Zweck von
    MD5, fuer die Authendifizierung eingesetzt zu werden.

    Naja, darf man sich nicht drueber aufregen 😉

    mfg
    v R



  • virtuell Realisticer schrieb:

    Ich frage mich sowieso, warum MD5 von so vielen eingesetzt wird, um eine
    Checksumme zu bilden.

    Das ist nicht Sinn und Zweck von MD5! Genauso wenig ist es Sinn und Zweck von
    MD5, fuer die Authendifizierung eingesetzt zu werden.

    Und was ist deiner Meinung nach der Sinn und Zweck von MD5?

    Wie CERT schon schreibt:

    http://www.cert.org/security-improvement/implementations/i002.01.html

    Using MD5 to verify the integrity of file contents

    The MD5 program generates a unique, 128-bit cryptographic message digest value derived from the contents of a file. This value is considered to be a highly reliable fingerprint that can be used to verify the integrity of the file's contents. If as little as a single bit value in the file is modified, the MD5 checksum for the file changes. Forgery of a file in a way that causes MD5 to generate the same result as that for the original file is considered to be extremely difficult.

    A set of MD5 checksums for critical system, application, and data files provides a compact way of storing information for use in periodic integrity checks of those files.

    Details for the MD5 cryptographic checksum program are provided in RFC 1321. Source code and additional information are available via FTP from ftp://ftp.cerias.purdue.edu/pub/tools/unix/crypto/md5



  • Descartes schrieb:

    Und was ist deiner Meinung nach der Sinn und Zweck von MD5?

    MD5: Sicherung der Integrität gegen menschliche bewußte böswillige Angriffe.

    CRC: Sicherung der Integrität gegen gegen zufällige technische Fehler.

    If as little as a single bit value in the file is modified, the MD5 checksum for the file changes.

    Das macht sogar ne schlichte Summe. Einzelbitfehler sind zu einfach. Mehrbitfehler sind das Gebiet, wo CRC besser ist, als stupide Summen.

    Forgery of a file in a way that causes MD5 to generate the same result as that for the original file is considered to be extremely difficult.

    Gegen menschen!



  • @PAD

    Hattest du schon mal regelmäßig Daten im Bereich einiger 100 MBs automatisch zu prüfen

    Wie sieht denn sowas in der Praxis aus ? Wird für jede "Original"-datei eine separate *.crc32 Datei angelegt und dann später mit der errechneten Checksumme verglichen oder speichert man das in einer Liste und sucht dann die Liste immer wieder durch nach dem entsprechenden CRC Wert ?

    Gruß WoWe



  • In einem ersten Lauf wird für alle zu überprüfenden Dateien eine Datei (Soll.crc) angelegt in der die Filenamen und die zugehörigen Checksummen stehen. Danach wird eine Datei (sum.crc) erzeugt, die die Checksumme über soll.crc Datei enthält.

    Bei der Überprüfung werden dann die ermittelten Checksummen in einer temporären Datei ist.crc ermittelt. Die Checksumme über diese Datei wird gebildet isum.crc und mit dem Wert aus dem Definitionslauf soll.crc verglichen.

    Bei Diskrepanzen werden die beiden Checksummendateien soll.crc und ist.crc verglichen um den/ die Kandidaten mit dem Fehler zu ermitteln. 😃



  • Hier habe ich durch Zufall noch eine Quelle für CRC32 entdeckt.

    http://www.codeproject.com/cpp/crc32.asp



  • Hallo PAD,

    hab da nochmal ne Frage dazu. In welchen Zeitabständen (vor jedem Backup?) macht ihr solch ein CRC Check und mit welchen Dateien (alle oder nur Verzeichnisse mit "Eigenen Dateien") ?

    Gruß WoWe



  • Die Arbeit hat weder mit Windows noch mit Backup zu tun.

    Wir benutzen es um zu überprüfen ob die auf einem lokalen PC geladene Version
    intakt ist und mit der im Netzwerk bereitgestellten Version der SW übereinstimmt.

    Überprüfung der Intaktheit, dient der Sicherstellung das unsere Produkte mit einer ungeänderten Version der TestSw geprüft werden.

    Überprüfung gegen Netzwerkversion, Sicherstellen das mit der neuesten zugelassenen Softeware getestet wird.



  • Hi,
    @PAD
    ich bekomme keinen CRC werte wie z.B. "5294c29a" sondern ich bekomme "16" zurück ;-(( was könnte ich falsch gemacht haben??
    Ich habe deinen Code in eine Klasse MyCRC gepankt aber an dem darf es ja nicht liegen oder??
    von result müsste man die fertige CRC32-Sum entgegenehemen dueren oder?? Was wird dann dann von der Function zurückgegeben ist nämlich das gleiche.

    Danke dir trotzdem fuer den super Code.

    mfg
    wdsl



  • @wdsl Da ich nicht weis was du wie gemacht hast, weis ich auch nicht was du wie falsch gemacht hast.

    Funktioniert den der C-Code???

    Wenn ja ist es eine Fehler in deiner C++ Umsetzung.



  • crc.cpp

    #include "crc.h"
    #include <dirent.h>
    #include <fstream.h>
    #include <system.hpp>
    
    #define FAIL 1
    #define PASS 0
    
    #define BUFFERLEN    8192 
    #define CRC32_DEFAULT_POLYNOMIAL 0x04c11db7L
    MyCRC::MyCRC(){
    }
    
    void  MyCRC::InitCrcCheckSum(unsigned long int *value)
    {
            *value = 0xFFFFFFFFL;
    
    }
    
    void MyCRC::GenCrcTable(unsigned long int value)
     // generate the table of CRC remainders for all possible bytes
    {
            register int i, j;
            register unsigned long CrcAccum;
            if (0l==value)
            value=CRC32_DEFAULT_POLYNOMIAL;
            for ( i = 0;    i < 256;  i++ )
            {
                    CrcAccum = ( (unsigned long) i << 24 );
                    for ( j = 0;  j < 8; j++ )
                    {
                            CrcAccum = (  CrcAccum & 0x80000000L )
                            ? ( ( CrcAccum << 1 ) ^ value)
                            : ( CrcAccum << 1 );
                    }
                    crc_table[i] = CrcAccum;
            }
    } 
    
    unsigned long int   MyCRC::CrcCheckSumC(char *tx_message,unsigned long int length, unsigned long int *value)
    {
            register unsigned long int i, j;
            register unsigned char count = 0;
    
            // update the CRC on the data block one byte at a time
            for ( j = 0;    j < length;  j++ )
            {
                    i = ( (unsigned int) ( *value >> 24) ^ tx_message[j] ) & 0xff;
                    *value = ( *value << 8 ) ^ crc_table[i];
            }
    
            return *value;
    
    }    //end checksum
    
    unsigned long int  MyCRC::CrcCheckSum(char *tx_message,unsigned long int length)
    {
            unsigned long int value;
            InitCrcCheckSum(&value);
            return CrcCheckSumC(tx_message,length,&value);
    }    // end checksum
    
    int MyCRC::FileCheckSum(char *file,unsigned long int *result)
    {
            unsigned long int i;
            char Buffer[BUFFERLEN+1];
            unsigned long int numread;
            FILE *fp;
            GenCrcTable(0);
            InitCrcCheckSum(result);
            if ((fp = fopen(file, "rb")) == NULL)
                    return FAIL;
            while (!feof(fp))
            {
                    numread = fread( Buffer, sizeof( char ), BUFFERLEN, fp);
                    if (0 != (numread % 4))
                    {
                            for (i=numread;i<BUFFERLEN;i++)
                                    Buffer[i]=0x00;
                                    numread=((numread % 4)+1)*4;
                    }
                    *result=CrcCheckSumC(Buffer,numread,result);
                    if (feof(fp))
                            break;
            }
    
            return PASS;
    }
    

    und noch die crc.h

    class MyCRC{
    public:
            MyCRC();
            int FileCheckSum(char *file,unsigned long int *result);
    private:
    
            unsigned long crc_table[256];
    
            unsigned long int value;
            void  InitCrcCheckSum(unsigned long int *value);
            void GenCrcTable(unsigned long int value);
            unsigned long int   CrcCheckSumC(char *tx_message,unsigned long int length, unsigned long int *value);
            unsigned long int  CrcCheckSum(char *tx_message,unsigned long int length);
    
    };
    

    ich hoffe du kannst mir jetzt weiterhelfen.

    mfg
    wdsl


Anmelden zum Antworten