Lösungsansatz und Sicherheitsfrage / statt ID einen HASH

newwarrior

Erfahrenes Mitglied
Hallo,

ich wollte mal folgenden Sicherheitsfall besprechen und fragen was ihr von dieser Lösung haltet.
Auf meiner Webseite, kann der User ein Album anlegen.
Wenn er dieser anlegt, wird ein Session Key generiert.
Code:
KEY = ALBUM_BESCHREIBUNG.DATUM;
SESSION_KEY = hash("sha512", $KEY);
Dieser Key und die Gallery_ID wird an die nächste Seite weitergeleitet, wo der User die Möglichkeit hat, Bilder hochzuladen.
Ich habe diesen Weg gewählt, weil dieser Hash dann eindeutig ist und ich nicht erst in der DB direkt danach eine Abfrage machen muss, welche ID, das neue Album bekommen hat. So spare ich mir auch unötige Abfragen bei der DB und ich kann das Album trotzdem eindeutig zuweisen.
Nach der erfolgreichen Speicherung der Bilder, werden darauf folgende Änderungen am Album oder der Bilder immer mit der ID erfolgen, nur halt nicht beim ersten Zugriff.
Zusätzlich wird nach dem ersten Zugriff dieser Hash wieder gelöscht.

Meine Frage ist jetzt, ob sowas eine "saubere" Lösung ist? Ist sie sicher?
 
Eine saubere Lösung ist es insofern, du die Datensätze anschließend nicht nach der ID (hash) sortieren willst, das Ergebnis wäre alles andere als sortiert. Insofern wäre ein integerer selbst-inkrementierender Primärschlüssel die bessere Alternative. Wenn das nicht gewünscht ist, kann man das durchaus so machen.

Sicherheit: Es ist insofern sicher, dass es ein Datum ist, was keine sicherheitskritischen Werte hat, also im Gegensatz zu einem Passwort. Wenn es ein Passwort wäre, würde ich behaupten, das es unsicher ist, da kein Salt verwendet wird. Da es "nur" als ID herhalten muss, ist es sicher, jedenfalls solange niemand am gleichen Tag ein Album mit der gleichen Beschreibung anlegt.
 
Der integerer selbst-inkrementierender Primärschlüssel wird auch erstellt, doch wird er erst nach der ersten Nutzung (hinzufügen der Bilder) benutzt.
Und der Key (hash) wird dann wieder gelöscht.

Benutzt sha512 nicht auch ein Salt?
 
Die Funktion hash bietet kein Salt, das ist das Problem. Verwende stattdessen crypt().

Wozu brauchst du den Hash dann überhaupt? Ich meine, worin liegt der Sinn?
 
Weil, ich nicht extra die ID aus der DB holen will.
Will es daher lieber für die erste Aktion mit dem HASH machen.

Also müsste ich mir folgender Funktion ja Hashwerte mit Salt einbinden und SHA512.
Ist das besser als Blowfish?

PHP:
<?php
function sha512crypt($password){
    $base64_alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
                    .'abcdefghijklmnopqrstuvwxyz0123456789+/';
    $salt='$6$';
    for($i=0; $i<9; $i++){
        $salt.=$base64_alphabet[rand(0,63)];
    }
    return crypt($password,$salt.'$');
}
echo sha512crypt('password')."<br />";
?>
 
Ich bezweifel, das da wirklich ein SHA512-Hash rauskommt, denn du hast die Parameter aus dem Manual nicht korrekt interpretiert:

PHPManual hat gesagt.:
CRYPT_SHA512 - SHA-512 Hash mit einem 16-Zeichen Salt, beginnend mit "$6$". Wenn anschließend "rounds=<N>$" folgt, gibt der Zahlenwert von N die Iterationsanzahl an, ansonsten wird 5000 als Anzahl angenommen. Die Anzahl muss zwischen 1000 und 999,999,999 liegen. Falls ein Wert außerhalb dieses Bereichs angegeben wird, wird die jeweils näher liegende Grenze als Anzahl genutzt.

Außerdem sind da Beispiele vorhanden, und du solltest erstmal prüfen, ob SHA512 überhaupt unterstützt wird. Sonst fällt das ganze nämlich auf CRYPT_STD_DES zurück, was "nur" 56Bit verschlüsselt.

EDIT: Ist schon spät. Habe die eine Zeile $6$ übersehen.

EDIT2: Ich weiß ja nicht, ob das Erstellen eines Hashs weniger CPU benötigt als ne simple DB-Abfrage.
 
Zuletzt bearbeitet:
Da bei mir sha512 wohl nicht ganz klappt, bin ich auf blowfish umgestiegen:

PHP:
function sha512crypt($password){
    $base64_alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
                    .'abcdefghijklmnopqrstuvwxyz0123456789./';
    $salt='$2a$31';
    for($i=0; $i<23; $i++){
        $salt.=$base64_alphabet[rand(0,63)];
    }
    return crypt($password,$salt.'$');
}

echo sha512crypt('password')."<br />";
 
Und nennst die Funktion immer noch sha512crypt(). ;-) Sowas is dann sog. Write-Only-Code.

Du könntest natürlich immer noch eine Prüfung einbauen, denn wer gibt dir die Garantie, dass Blowfish weiterhin unterstützt? Mittelfristig (in 2012) soll SHA-3 standardisiert werden. Irgendwann wird auch PHP mal mit neuen Algos versehen. Das zu Prüfen halte ich persönlich für wichtig.
 
Ups, habe nur zwei drei Dinge angepasst, den Namen vergessen.
Habe inzwischen die Funktion erweitert.
Versucht jetzt das höchste zu nehmen, und geht sonst stufenweise nach unter bei der Verschlüsselung.
Danke für die Hilfe.
 
Zurück