it-swarm-eu.dev

Ist ein Rand von / dev / urandom für einen Anmeldeschlüssel sicher?

Nehmen wir an, ich möchte ein Cookie für einen Benutzer erstellen. Würde einfach einen 1024 Bit String mit / dev/urandom generieren und prüfen, ob er bereits existiert (Schleife bis ich ihn bekomme) eine einzigartige) genügen?

Sollte ich den Schlüssel basierend auf etwas anderem generieren? Ist das irgendwie anfällig für einen Exploit?

187
Incognito

Die kurze Antwort lautet ja. Die lange Antwort lautet auch ja. /dev/urandom liefert Daten, die angesichts der vorhandenen Technologie nicht von wahrer Zufälligkeit zu unterscheiden sind. Immer "bessere" Zufälligkeit als was /dev/urandom liefert ist bedeutungslos, es sei denn, Sie verwenden einen der wenigen "informationstheoretischen" kryptografischen Algorithmen, was nicht Ihr Fall ist (Sie würden es wissen).

Die Manpage für urandom ist etwas irreführend, wohl völlig falsch, wenn sie darauf hindeutet, dass /dev/urandom kann "keine Entropie mehr haben" und /dev/random sollte bevorzugt werden; der einzige Moment, in dem /dev/urandom könnte implizieren, dass ein Sicherheitsproblem aufgrund geringer Entropie in den ersten Augenblicken einer neuen, automatisierten Betriebssysteminstallation auftritt; Wenn der Computer bis zu einem Punkt gestartet wurde, an dem eine gewisse Netzwerkaktivität aufgetreten ist, hat er genügend physische Zufälligkeit gesammelt, um eine Zufälligkeit von ausreichend hoher Qualität für alle praktischen Anwendungen bereitzustellen (ich spreche hier von Linux; unter FreeBSD, diesem momentanen Moment von geringem Wert) Schwäche tritt überhaupt nicht auf). Auf der anderen Seite, /dev/random hat die Tendenz, zu ungünstigen Zeiten zu blockieren, was zu sehr realen und lästigen Usability-Problemen führt. Oder, um es in weniger Worten auszudrücken: benutze /dev/urandom und sei glücklich; verwenden /dev/random und tut mir leid.

( Bearbeiten: diese Webseite erklärt die Unterschiede zwischen /dev/random und /dev/urandom Sehr deutlich.)

Zum Erstellen eines "Cookies": Ein solches Cookie sollte so sein, dass keine zwei Benutzer dasselbe Cookie verwenden und dass es rechnerisch unmöglich ist, den Wert eines vorhandenen Cookies zu "erraten". Eine Folge von zufälligen Bytes macht das gut, vorausgesetzt, sie verwendet Zufälligkeit von angemessener Qualität (/dev/urandom ist in Ordnung) und dass es lang genug ist. Als Faustregel gilt, wenn Sie weniger als 2 habenn Benutzer ( n = 33 Wenn die gesamte Erdbevölkerung Ihr System nutzen könnte), dann ist eine Folge von n + 128 Bits breit genug ;; Sie müssen nicht einmal nach einer Kollision mit vorhandenen Werten suchen: Sie werden sie in Ihrem Leben nicht sehen. 161 Bit passen in 21 Bytes.

Es gibt are einige Tricks, die machbar sind, wenn Sie kürzere Cookies möchten und dennoch vermeiden möchten, nach Kollisionen in Ihrer Datenbank zu suchen. Dies sollte jedoch für ein Cookie kaum erforderlich sein (ich gehe von einem webbasierten Kontext aus). Denken Sie auch daran, Ihre Cookies vertraulich zu behandeln (d. H. HTTPS zu verwenden und die Flags "sicher" und "HttpOnly" zu setzen).

222
Thomas Pornin

Ja, das ist eine großartige Möglichkeit.

@ Thomas Erklärung nagelt es. Und er hat völlig Recht, die Manpage /dev/urandom Zu kritisieren. Genau richtig.

Aber überspringen Sie "Überprüfen, ob es bereits existiert". Diese Überprüfung ist sinnlos. Es wird nicht passieren. (Die Wahrscheinlichkeit, dass dies geschieht, ist geringer als die Wahrscheinlichkeit, mehrmals am selben Tag vom Blitz getroffen zu werden.)

25
D.W.

Beachten Sie Edge-Fälle, wenn Sie Linux oder NetBSD verwenden.

Unter Linux sollten Sie sicherstellen, dass nach dem Booten genügend Entropie gewonnen wurde, um das CSPRNG ordnungsgemäß zu setzen, oder den Systemaufruf getrandom() verwenden, um aus /dev/urandom und blockieren Sie nur in dem seltenen Fall, dass keine ausreichende anfängliche Startentropie nach dem Start verfügbar ist.

In NetBSD sollten Sie mindestens einmal aus /dev/random Lesen, bevor Sie aus /dev/urandom Lesen, um sicherzustellen, dass es richtig gesetzt wurde.

Unter FreeBSD und MacOS gibt es keinen Unterschied zwischen /dev/random Und /dev/urandom.

Die kurze Antwort lautet weiterhin /dev/urandom.

Weitere Informationen finden Sie unter Verwendung von/dev/random vs/dev/urandom .

1
Tom Hale