GUID-Erzeugung mit uniqid - ausreichend sicher?

16/07/2014 - 21:07 von Michael Vogel | Report spam
Hi!

Ich programmiere für ein dezentrales soziales Netzwerk (Open Source).

Beitràge erhalten eine GUID, von der wir natürlich hoffen, dass sie über
das gesamte Netzwerk eindeutig bleibt. Ich habe mir (weil ich in dem
Umfeld Änderungen vornehmen möchte), jetzt mal die Funktion angeschaut:

function random_string($size) {
// generate a bit of entropy and run it through the whirlpool
$s = hash('whirlpool', (string) rand() . uniqid(rand(),true) .
(string) rand(),false);
return(substr($s,0,$size));
}

Diese Funktion wird (derzeit) mit dem Parameterwert "16" aufgerufen und
erzeugt dann einen Wert.

Mir erscheint es wenig sinnvoll, den Rückgabewert einer Funktion, die
eine eindeutige ID erzeugt zu nehmen, um daraus einen Hash zu bilden,
der wiederum abgeschnitten wird.

Nach meinem Verstàndnis macht es die Sache eher schlechter.

Meine Vorstellung ist eine Funktion in der folgenden Art:

function get_guid($size) {
$prefix = "";
while (strlen($prefix) < ($size - 13))
$prefix .= mt_rand();

$s = substr(uniqid($prefix), -$size);
return($s);
}

D.h. ich würde dem Wert von "uniqid" noch einen mehr oder weniger langen
Zufallswert voranstellen. Spricht etwas gegen diese Vorgehensweise? Hat
"uniqid" irgendwelche bekannten Probleme, weswegen man nicht so vorgehen
sollte?

Gleichzeitig würde ich bei der GUID auf eine Lànge von 32 gehen. Dies
sollte eine hinreichend große Sicherheit vor Duplikaten garantieren.

Was meint ihr?

Michael
 

Lesen sie die antworten

#1 k
17/07/2014 - 08:33 | Warnen spam
Michael Vogel writes:

Hi!

Ich programmiere für ein dezentrales soziales Netzwerk (Open Source).

Beitràge erhalten eine GUID, von der wir natürlich hoffen, dass sie über
das gesamte Netzwerk eindeutig bleibt. Ich habe mir (weil ich in dem
Umfeld Änderungen vornehmen möchte), jetzt mal die Funktion angeschaut:

function random_string($size) {
// generate a bit of entropy and run it through the whirlpool
$s = hash('whirlpool', (string) rand() . uniqid(rand(),true) .
(string) rand(),false);
return(substr($s,0,$size));
}

Diese Funktion wird (derzeit) mit dem Parameterwert "16" aufgerufen und
erzeugt dann einen Wert.

Mir erscheint es wenig sinnvoll, den Rückgabewert einer Funktion, die
eine eindeutige ID erzeugt zu nehmen, um daraus einen Hash zu bilden,
der wiederum abgeschnitten wird.

Nach meinem Verstàndnis macht es die Sache eher schlechter.



Ack.

Meine Vorstellung ist eine Funktion in der folgenden Art:

function get_guid($size) {
$prefix = "";
while (strlen($prefix) < ($size - 13))
$prefix .= mt_rand();

$s = substr(uniqid($prefix), -$size);
return($s);
}

D.h. ich würde dem Wert von "uniqid" noch einen mehr oder weniger langen
Zufallswert voranstellen. Spricht etwas gegen diese Vorgehensweise? Hat
"uniqid" irgendwelche bekannten Probleme, weswegen man nicht so vorgehen
sollte?

Gleichzeitig würde ich bei der GUID auf eine Lànge von 32 gehen. Dies
sollte eine hinreichend große Sicherheit vor Duplikaten garantieren.



Soll die GUID auch nicht zu erraten sein? Dann verwende nicht uniqid.
Davor wird in der Doku auch explizit gewarnt.

,-[http://de1.php.net/manual/en/function.uniqid.php]
| Warning
| This function does not create random nor unpredictable strings. This
| function must not be used for security purposes. Use a cryptographically
| secure random function/generator and cryptographically secure hash
| functions to create unpredictable secure IDs.
`-

Was spricht dagegen eine ausreichend lange Zufallszahl (mit zB
openssl_random_pseudo_bytes() zu erzeugen und diese mit einem geeigneten
salt (jede Installation bekommt eigenen salt) als zB sha1 Hash zu
speichern; (wenn git mit sha1 auskommt, sollte es für euch auch
ausreichen).

KP

Ähnliche fragen