Hugl Am Mugl: Welche Hash-Technik verwenden?

Hallo Leute,

ich habe hier ~5000 Emailadressen und muss diese in einer URL Variablen (GET) einem PHP Script übergeben. (nicht gleichzeitig, sondern per User Link)

Aus sicherheitsgründen möchte ich aber dies natürlich nicht im Klartextmodus machen, sondern ich würde diese Adresse gerne maskieren/schützen.

Jetzt hatte ich folgende Idee: Ich rechne zu jeweils allen Emailadressen einen Hashwert aus. Diesen Hashwert übergebe ich dann per URL. Die Rückführung und zuordnung der Kontakte erfolgt dann wieder mit diesem Hashwert.

Eignet sich MD5 hier? Wird jeder Hash ohne Konflikte eindeutig zuordenbar bleiben?

Würde es auch einen Weg geben, mit dem ich die Emailadresse codieren, per URL versenden und dann im PHP wieder decodieren könnte?

Vielen Dank für eure Zeit!

  1. Tach!

    Jetzt hatte ich folgende Idee: Ich rechne zu jeweils allen Emailadressen einen Hashwert aus. Diesen Hashwert übergebe ich dann per URL. Die Rückführung und zuordnung der Kontakte erfolgt dann wieder mit diesem Hashwert.

    Du kannst dazu jeden beliebigen Wert nehmen, solange du eine Zuordnungstabelle pflegst, was bei einem Hash ja auch nötig ist.

    Eignet sich MD5 hier? Wird jeder Hash ohne Konflikte eindeutig zuordenbar bleiben?

    Jein. Konflikte wird es zwar nicht geben (theoretisch ja, praktisch höchstwahrscheinlich nicht), aber wenn das verwendete Verfahren bekannt ist, kann jeder aus einer Email-Adresse diesen Hash herstellen. Je nachdem, was damit für Rechte verbunden sind, können diese nun recht einfach ausgenutzt werden. Ein zufälliger nicht erratbarer Wert wäre hier meines Erachtens sicherer.

    dedlfix.

  2. Für den konkreten Anwendungsfall ist es gar nicht nötig, die Mailadresse selbst zu haschen. Du kannst genau genommen auch eine ID aus der, die Adressen beinhaltenden Tabelle salzen und "hashen" oder noch besser: statt überhaupt zu haschen, in der Tabelle einen eindeutigen (unique) Zufallswert ablegen, der groß genug ist, um nicht einfach alle Zahlen von 1-10000 durchraten zu können.

    Eine Idee wäre es, eine UUID zuzuordnen. Auf Linux Systemen kann man die mit einem lesenden Zugriff auf /proc/sys/kernel/random/uuid eine (pseudo-)zufällige UUID erzeugen. Hier mal ein Test:

    <?php  
    for ($i=0; $i<20; $i++) {  
       $uuid=trim(file_get_contents('/proc/sys/kernel/random/uuid'));  
       echo $uuid,"<br>\n";  
    }  
    ?>
    

    Mit PHP selbst kann man eine zeitbasierte UUID erzeugen. Lese (auch die Kommentare):

    http://php.net/manual/de/function.uniqid.php

    Vorteil der zugeordneten UUID wäre es, dass ohne Deine Zuordnungstabelle gar kein Zusammenhang zwischen der UUID und der Mailadresse besteht. Wenn aber die Tabelle in fremde Hände gerät, dann ist eh "Schluss mit lustig", weil die Adressen ja offenbar auch im Klartext gespeichert sind.

    Falls Du bei MD5 oder einem anderen Hash bleiben willst:

    Da Rainbow-Tables für jeden Hash-Alghorithmus existieren empfehle ich die Adressen zu salzen. Da (und wenn) es nur um den Schutz nicht besonders wichtiger Daten geht mag wohl einfaches Salzen und Haschen mit md5 genügen.

    Eignet sich MD5 hier? Wird jeder Hash ohne Konflikte eindeutig zuordenbar bleiben?

    Aber ja. Die Wahrscheinlichkeit eines Konfliktes ist hinsichtlich der Entropie Länge der Mailadressen gering.

    Jörg Reinholz

  3. Hallo,

    so ganz habe ich deinen Anwendungsfall noch nicht verstanden, daher ein paar Rückfragen:

    ich habe hier ~5000 Emailadressen und muss diese in einer URL Variablen (GET) einem PHP Script übergeben. (nicht gleichzeitig, sondern per User Link)

    Was macht das Script mit der Adresse? Woher kommt die URL und wer macht den Request? Geht es hier vielleicht um eine Newsletter-Steuerung oder ähnliches?

    Aus sicherheitsgründen möchte ich aber dies natürlich nicht im Klartextmodus machen, sondern ich würde diese Adresse gerne maskieren/schützen.

    Geht es dir darum, dass die E-Mail-Adresse nicht in der URL auftaucht, ein Angreifer also nicht einfach eine andere Adresse eintragen und durchprobieren kann?

    Jetzt hatte ich folgende Idee: Ich rechne zu jeweils allen Emailadressen einen Hashwert aus. Diesen Hashwert übergebe ich dann per URL. Die Rückführung und zuordnung der Kontakte erfolgt dann wieder mit diesem Hashwert.

    Die Frage ist: Hat das Script Zugriff auf die Zuordnungstabelle Hash <> E-Mail? Oder ist dem Script die E-Mail-Adresse noch nicht bekannt? Ohne eine solche Datenbank kannst du den Hash nicht umkehren und »zurückrechnen« – das ist ja der Sinn eines (guten kryptographischen, gesalzenen) Hashes.

    Im Beispielfall der Newsletter-Bestätigung oder -Abmeldung generiert man üblicherweise einen zufälligen Token, der vom Angreifer schwer erraten werden kann (man müsste einen großen Zahlenraum per Brute Force durchprobieren) und nicht von der E-Mail-Adresse abgeleitet ist (also kein Hash). Dieser Zufallswert muss eindeutig pro Kontakt sein. Das wird mit einer Schleife sichergestellt: Solange neue Token erzeugen, bis im aktuellen Kontext kein Konflikt gefunden wird.

    Hier kann man entweder mit einem einmal generierten Identifier arbeiten oder mit einem One-Time-Pad, das nur für die gewünschte Aktion gültig ist (Bestätigung der Anmeldung, Abmeldung, weitere Aktionen…).

    Würde es auch einen Weg geben, mit dem ich die Emailadresse codieren, per URL versenden und dann im PHP wieder decodieren könnte?

    Im Prinzip ist eine solche synchrone Verschlüsselung möglich. Beide Seiten müssen dann den Schlüssel kennen, wenn du wirklich neue Daten übertragen willst. Falls du via HTTP verschlüsselt und authentifiziert Daten von A nach B transportieren willst, wären SSL und HTTP Basic Authentication sinnvoller. Wenn du nur einen nicht erratbaren Identifier brauchst, erscheint mir das unnötig kompliziert.

    </afaik>
    Mathias