MD5-Hashing für Dummies

Data Vault 2.0 ist ein aktueller Trend im Data Warehouse Umfeld. Eine elementare Neuerung im Vergleich zur ersten Version ist der Einsatz von Hash-Funktionen. Diese Hash-Funktionen werden dazu verwendet, um eindeutige technische Schlüssel (Hashkeys) zu erzeugen und Deltas (Hashdiffs) – also Änderungen an Datensätzen – zu identifizieren. Empfohlen wird dabei der Einsatz des MD5 – Algorithmus (siehe: https://de.wikipedia.org/wiki/Message-Digest_Algorithm_5), da er für die meisten Anwendungsfälle als ausreichend angesehen wird und Kollisionen sehr unwahrscheinlich (aber nicht unmöglich) sind. Wichtig ist in diesem Zusammenhang zu erwähnen, dass die MD5-Verschlüsselung hier nicht aus Sicherheitsgesichtspunkten verwendet wird. In diesem kurzen Beitrag befasse ich mich ausschließlich mit MD5, es soll nur als erster Einstieg in die Materie dienen.

Der MD5-Algorithmus erzeugt aus einer beliebigen Nachricht immer einen 32 Zeichen langen Hashwert (hexadezimale Notierung) . Um ein erstes Gefühl zu bekommen, was hashing eigentlich bedeutet, kann man das unter Linux (ich nutze dazu beispielsweise einen RaspberryPi Modell 2)  sehr einfach ausprobieren. Das verwendete Programm ist bei den meisten Standard-Distributionen mit installiert (Bestandteil der coreutils) und heißt md5sum.

Die erste sehr einfache Möglichkeit ist, sich über das echo-Kommando und die Umleitung über eine Pipe, sowie den Aufruf des Programmes md5sum einen Hashwert anzeigen zu lassen. Um sich beispielsweise den Hashwert für die Nachricht abc anzeigen zu lassen,  gibt man folgendes in der Kommandozeile ein:

echo -n 'abc' | md5sum

Als Ergebnis erhält man diese Ausgabe:

900150983cd24fb0d6963f7d28e17f72

Auf dem Mac kann man in einem Terminal ähnlich vorgehen – der einzige Unterschied besteht darin, dass das MD5-Programm auf dem Mac schlicht md5 heißt. Der Aufruf im Terminal auf dem Mac lautet also:

echo -n 'abc' | md5

Die Ausgabe ist auf dem Mac ist die Gleiche.

Möchte man nicht eine interaktive Eingabe der Nachricht, sondern eine Datei (ja, das kann auch eine Nachricht sein) als Eingabe für den MD5-Algorithmus verwenden, so kann unter Linux über openssl ein Hashwert berechnet werden.  Dazu ruft man auf der Kommandozeile unter Linux folgenden Befehl auf:

openssl dgst -md5 Dateiname

Mit diesem Befehl wird der Inhalt der Datei Dateiname mit dem MD5-Algorithmus verschlüsselt. Wenn also in der Datei test.txt der Text abc (ohne Zeilenumbruch und sonstigen Sonderzeichen)  enthalten ist, erhalte ich die gleiche Ausgabe wie im o.a. Beispiel.

Auf dem Mac erreicht man das gleiche Ergebnis mit diesem Kommando:

openssl md5 Dateiname

Weitere Details findet man wie immer in den man-pages unter Linux oder auf dem Mac.

Unter Windows gibt es leider keine im Betriebssystem verankerte MD5 Funktion, jedoch gibt es zahlreiche Zusatzprogramme über die man MD5-Checksummen berechnen kann. Die MD5-Funktion gibt es in sehr vielen Implementierungen, bspw. als Java-Code, Excel-VBA-Code, in der Bibliothek hashlib von Python sowie in vielen built-in Funktionen von Datenbanken (z.B. MS SQL Server 2016, DB2 ab Version 11.1 etc.).

Zu beachten ist jedoch, dass die MD5-Funktion auf binärer Ebene fungiert. abc ist dabei nicht gleich ABC, Groß- und Kleinschreibung ist zu beachten, ebenso wie der Zeichensatz (UTF8, ASCII etc.) sowie weitere Details die bis in den Kern eines Computers reichen (z.B. Byte-Reihenfolge – die so genannte Endianess). Das bedeutet, dass eine Nachricht auf dem einen Computer nicht zwingend die gleiche Nachricht auf einem anderen Computer erzeugt. Aus diesem Grund muss die Hashwert-Berechnung gerade im Kontext von Data Vault 2.0 abgestimmten und unternehmensweit kommunizierten Konventionen unterliegen. Mehr dazu vielleicht in einem Folge-Beitrag.

Nicht so häufig verwendete Linux-Kommandos unter RHEL

Als Entwickler kennt man viele Linux-Kommandos und arbeitet täglich mit diesen. Selten benötigte Kommandos die nur bei bestimmten Anlässen hilfreich sind, kennt man nicht unbedingt. In dieser Liste sind einige dieser Kommandos aufgeführt:

Befehl Beschreibung
uname -r gibt die Kernel-Version aus
uname -m gibt die Rechner-Architektur (32 oder 64-Bit) aus
sestatus gibt aus, in welchem Modus RHEL, CentOS oder Fedora betrieben wird (z.B. Permissive Mode oder Enforcing Mode)
lscpu | grep -i byte gibt die Byte-Reihenfolge (Big oder Little Endian)

 

Leerzeichen zwischen zwei Kommas mit awk-Skript identifizieren

Dieses kleine awk-Skript prüft rechtsbündige Leerzeichen zwischen Kommas, die in einem fiktiven Szenario in einer Datei nicht erlaubt sind:

 BEGIN{
  FS=",";
 }
  / ,/ {print "unerlaubte rechtsbündige Blanks bei Zeile: " , NR;
        print "IDENTIFIER-->", $5;
  anzahl = anzahl +1;
}
 END{
  if(anzahl==0) print "O.K." , FILENAME;
  if(anzahl>0) print "ERROR!!! ", anzahl , "rechtsbündige(s) Leerzeichen in " FILENAME; 
 }