Python: md5sum, sha1sum und weitere Funktionen nachbilden

Nicht nur unter Linux gibt es die Programme md5sum, sha1sum und weitere, mit denen ein eindeutiger Hash von einer Datei erzeugt werden kann. Mit diesem Hash lässt sich leicht überprüfen, ob eine Datei bei der Übertragung oder aus einem anderen Grund verändert wurde. Da es dafür keine direkte Funktion in Python gibt muss sie nachgebildet werden. Hierfür bieten sich die Funktionen des hashlib Moduls an.

Das folgende Skript zeigt dessen Verwendung. Der wichtigste Teil ist dabei die sumfile()-Funktion. In dieser wird eine neue Hash-Funktion angelegt und die Datei geöffnet. Anschließend wird die Datei stückchenweise eingelesen und der Hash aktualisiert. Ist dies geschafft wird der berechnete Hash-Wert zurückgegeben. Die Datei wird stückchenweise eingelesen, weil das Programm sonst bei größeren Dateien sehr schnell an die Grenzen des Arbeitsspeichers stoßen könnte. Im hier vorgestellten Skript werden nur 4KByte der Datei im Speicher gehalten.

#!/usr/bin/env python
import hashlib
import os
from optparse import OptionParser

def sumfile(hashname, filename):
    h = hashlib.new(hashname)
    fp = open(filename)

    while True:
        d = fp.read(4096)
        if not d:
            break
        h.update(d)

    fp.close()
    return h.hexdigest()

if __name__ == '__main__':
    parser = OptionParser()
    parser.add_option("", "--hash", dest = "hashname", default = "md5")
    (options, args) = parser.parse_args()

    for filename in args:
        if os.path.isfile(filename):
            print sumfile(options.hashname, filename),"", filename

Um die Funktion zu testen, eignet sich das folgende Skript. Es lässt zunächst den Hash durch das Skript erzeugen und überprüft das Ergebnis anschließend mit den "echten" Programmen. Wenn alles in Ordnung ist, sollte hinter jedem Dateinamen "OK" stehen.

#!/bin/sh
echo "========= Checking md5sum ========="
./sum.py --hash md5 * | md5sum -c
echo "========= Checking sha1sum ========="
./sum.py --hash sha1 * | sha1sum -c
echo "========= Checking sha224sum ========="
./sum.py --hash sha224 * | sha224sum -c
echo "========= Checking sha256sum ========="
./sum.py --hash sha256 * | sha256sum -c
echo "========= Checking sha384sum ========="
./sum.py --hash sha384 * | sha384sum -c
echo "========= Checking sha512sum ========="
./sum.py --hash sha512 * | sha512sum -c

Achtung: Um das Skript zum Prüfen nutzen zu können, sollte das Python Skript unter dem Namen sum.py und im gleichen Ordner abgespeichert werden.

Achtung: Eventuell stehen nicht alle Hash-Funktionen unter allen Python Versionen zur Verfügung.

Verwandte Artikel