Unter macOS alle Dateien eines Verzeichnisses hashen

Für die Überprüfung einiger Dateien unter macOS wollte ich diese mittels SHA1 hashen. Dazu dient das Kommando shasum:

shasum text.txt

Möchte man nun die Hashes aller Dateien eines Verzeichnisses berechnen, so kann man sich folgenden Befehls bedienen:

find . -type f -print0  | xargs -0 shasum

Anschließend erhält man eine Liste der Dateien mit den entsprechenden Hashwerten:

f6b53e378767be11ec05a25bc1be5cd6bd973fc6  ./schema.dxf
d5e5fb854be213410d8f734fee284bb12615349f  ./schema.svg
43ced91a43074bae41b5774bde6e35015ba1ed9c  ./schema.skb
0160e7f2265b51d6c5067a1468aa0cda42bc7e43  ./schema.skp
80b96f10c14b6c9bad809565d4be5c1ddc0c36a1  ./schema1.jpg
b4c9ecdc0cdec4b939049ad5e55164a09c7c6f85  ./schema2.jpg
821b657612029cf127cfb920b1943072ee333e54  ./schema.sh
64d44e1871aaa25cf0a5f34f76979f62be9617d6  ./schema.txt

Hashes unter macOS ermitteln

Wenn man eine Datei von einer Webseite herunterlädt, so sind dort manchmal Hashes angeben. Mit diesen Prüfsummen kann man testen, ob die heruntergeladene Datei der Datei auf der Festplatte entspricht. Möchte man nun unter macOS das ganze überprüfen, stehen einem hierfür die Tools md5 und shasum zur Verfügung. Um den MD5 einer Datei zu berechnen, gibt man im Terminal folgendes ein:

md5 example.img

Analog dazu gestaltet sich die Befehlszeile, wenn man einen SHA-1 Hash berechnen möchte:

shasum example.img

Soll stattdessen ein SHA256-Hash berechnet werden, so ist dies mittels shasum ebenfalls möglich:

shasum -a 256 example.img

Hash von einem beliebigen .NET Objekt erzeugen

Unter .NET gibt es an jedem Objekt die Methode “GetHashCode” welche einen HashCode zurückliefert. Das Problem an dieser Methode ist jedoch das sie vom Objekt selbst implementiert werden muss. Möchte man nun eine Methode mit der man jedes Objekt generisch hashen kann, so ist diese Funktion hilfreich:

public string GetSHA1HashFromObject(object obj)
{
	SHA1CryptoServiceProvider sha1Provider=new SHA1CryptoServiceProvider();
	DataContractSerializer serializer=new DataContractSerializer(obj.GetType());

	using(MemoryStream memoryStream=new MemoryStream())
	{
		serializer.WriteObject(memoryStream, obj);
		sha1Provider.ComputeHash(memoryStream.ToArray());
		return Convert.ToBase64String(sha1Provider.Hash);
	}
}

Die Funktion serialisiert dabei das Objekt und hasht anschließend das serialisierte Objekt. Damit ist es egal, welches Objekt in die Funktion gegeben wird.

Lokale Revision eines Git Repositories ermitteln

Möchte man die lokale Revision eines Git Repositories ermitteln so reicht es in der Konsole:

git log -n 1

einzugeben. Das ganze sieht auf dem Terminal dann so aus:

commit 1c40074d28676ec996ec91f1719cff43077f15f6
Author: Example 
Date:   Tue Jan 3 09:52:23 2013 +0800

    Bugfixes in example function.

Soll nur der Hash ausgeben werden so muss die Kommandozeile wie folgt aussehen:

git log -n 1 --pretty=format:"%H"

Damit bekommt man dann nur den entsprechenden Hashwert ausgegeben.

NB-Town speichert Passwörter im Klartext

In den letzten Tagen kursierten die Passworthashs der Communities Last.fm, eHarmony und LinkedIn durch das Netz. Bei Last.fm waren dies ungesalzene MD5 Hashs die man per Brute Force in relativ kurzer Zeit zurückrechnen kann.

Das Problem ist das sobald man dies “zurückrechnen” kann, kann man die Passwörter bei anderen Diensten (Mail, Amazon, usw.) ausprobieren und damit Schindluder treiben. In einer perfekten Welt würde zwar jeder für jeden Dienst ein extra Passwort benutzen, aber es ist nun mal keine perfekte Welt.

Noch problematischer wird das ganze wenn man die Passwörter im Klartext (siehe Update) speichert (was man definitiv nicht tun sollte). So gibt es im Norden Deutschlands eine erfolgreiche Community mit knapp 140000 Mitgliedern welche auf den Namen NB-Town hört und unter www.nb-town.de zu finden ist.

Das Problem offenbart sich sobald man einmal die “Passwort vergessen?” Funktionalität benutzt. Daraufhin bekommt man folgende Mail:

Die Passwort vergessen? Mail

Wie man sieht wird das Passwort im Klartext gespeichert (sonst könnte es die “Passwort vergessen?” Funktionalität nicht zurücksenden), was bei einer solchen Community fahrlässig ist. Sobald jemand an die Datenbank herankommen so hat er 140000 Passwörter + die passenden Identitäten dazu. Ein anderes Problem bei Passwörtern welche im Klartext gespeichert werden, ist immer das die Betreiber Zugriff auf diese haben und damit (theoretisch) Schindluder betreiben können.

Deshalb gilt, Passwörter immer gehasht (aber nicht mit MD5 ;)) und gesalzen speichern. Einene schönen Artikel dazu gibt es bei Heise unter http://www.heise.de/security/artikel/Passwoerter-unknackbar-speichern-1253931.html.

Update:
Die Passwörter werden in der Datenbank nicht im Klartext gespeichert, sondern AES verschlüsselt. Bei der “Passwort vergessen?” Funktion wird der Schlüssel in der Query übergeben, so das das Passwort entschlüsselt werden kann. Man müsste als böser Mensch also an den Webserver und den Datenbankserver herankommen und um Zugriff auf die Passwörter zu bekommen.