ersetzen rand() mit openssl_random_pseudo_bytes()

Ich brauche einen Ersatz für PHP rand() - Funktion, die verwendet einen kryptographisch starken Zufallszahlengenerator.

Den openssl_random_pseudo_bytes() Funktion bekommt man Zugriff auf die starken random number generator, aber es gibt seine Daten als byte-string. Stattdessen muss eine ganze Zahl zwischen 0 und X.

Ich vorstellen, der Schlüssel ist, um die Ausgabe openssl_random_pseudo_bytes() in ein integer ist, dann können Sie Mathe auf, dass Sie es müssen. Ich kann mir denken, ein paar "brute-force" Möglichkeiten der Umwandlung von einem byte-string in einen integer, aber ich hatte gehofft, für etwas ... elegant.

  • mt_rand() geben viel bessere Qualität der Zufallszahlen als rand(), aber es ist nicht kryptografisch starke entweder.
  • Vorsicht, diese Antwort ist falsch. um genauer zu sein, die "% $ - range" - Teil ist falsch. Nehmen Sie Folgendes Szenario: Sie erstellen wollen, zahlen zwischen 1 (einschließlich) und 4 (ausschließlich) (da Sie max-min). $range = 3. Nun 3 nicht gleichmäßig aufzuteilen ist in 2^8 was bedeutet, dass 1 geht häufiger zu sein als 3. Seien Sie sehr vorsichtig, Sie wollte, einen sicheren Zufallszahlengenerator aber versehentlich machte es unsicher, dies ist, warum es wird empfohlen, zur Verwendung der vorhandenen Implementierungen.
  • Wenn das richtig verstehe, in ein 8-bit-Sortiment erhalten Sie 85 Sätze von [1,2,3] sowie ein [1,] übrig, dass eine "1" über 1.17% häufiger auftauchen als "2" oder "3", richtig? Wie würden Sie dieses problem lösen? Offensichtlich mit einer vorhandenen Implementierung eine option nicht, oder ich hätte nicht die Frage gestellt.
  • $num = hexdec(bin2hex(openssl_random_pseudo_bytes($length,$s))); $max = pow(2, 8*length); //for clarity, you can replace with a faster bit shift $remainder = $max % $range; $max = $max - $remainder; if ($num > $max){ return crypto_rand($min,$max); } return $min + ($num % $range);
  • In Worten, Sie im wesentlichen erhalten die höchste Zahl, die gleichmäßig teilt in Ihrem Bereich (auch im Bereich der random number generator), und wenn der Wert höher ist, müssen Sie die Funktion erneut ausführen.
  • Ich denke, Sie sollte sich ändern: $max = $max - $Rest; bis $max = $max - $Rest - 1; - sonst bekommt man die ungleiche Verteilung in Richtung auf den ersten Wert in der Reihe.

InformationsquelleAutor tylerl | 2009-08-21
Schreibe einen Kommentar