Wie erzeuge ich eine eindeutige Sitzungs-ID in Python?Eindeutige Sitzungs-ID in Python
Antwort
können Sie die uuid library verwenden wie so:
import uuid my_id = uuid.uuid1() # or uuid.uuid4()
Es kann als die Schaffung einer Zufallszahl so einfach sein. Natürlich müssten Sie Ihre Sitzungs-IDs in einer Datenbank oder etwas speichern und jedes einzelne von Ihnen erzeugte überprüfen, um sicherzustellen, dass es kein Duplikat ist, aber die Wahrscheinlichkeit ist groß, wenn die Nummern groß genug sind.
Genau, also meine Lösung: http://stackoverflow.com/questions/817882/unique-session-id-in-python/818040#818040 –
import os, base64
def generate_session():
return base64.b64encode(os.urandom(16))
Warum die Downmod? –
Ich Duno, aber das scheint eine gültige Lösung zu sein. Allerdings würde ich Ihnen raten, das nachgestellte "==" zu entfernen und auch einen Zeitstempel für weniger Wahrscheinlichkeit einer Kollision einzuschließen. – Unknown
Die Wahrscheinlichkeit einer Kollision nach 4 Milliarden Iterationen beträgt 1 zu 8 Milliarden.Wenn ich die Wahrscheinlichkeit einer Kollision weiter reduzieren möchte, kann ich einfach die Anzahl von Bits erhöhen, d. H. Os.urandom (32). Und ich verstehe nicht, was das abstreifen des nachlaufenden "==" erreichen soll. –
Für was ist die Sitzung? Eine Web-App? Vielleicht möchten Sie sich the beaker module ansehen. Es ist das Standardmodul für die Behandlung von Sitzungen in Pylonen.
UPDATE: 2016-12-21
Viel hat sich in einem der letzten ~ 5yrs passiert ist. /dev/urandom
wurde aktualisiert und gilt nun als eine High-Entropy-Quelle der Zufälligkeit auf modernen Linux-Kernel und Distributionen. In den letzten 6 Monaten haben wir Entropie-Verhungern auf einem Linux 3.19 Kernel mit Ubuntu gesehen, also glaube ich nicht, dass dieses Problem "gelöst" wird, aber es ist schwierig genug mit Zufälligkeit von niedriger Entropie zu enden, wenn man nach Zufälligkeit fragt aus dem Betriebssystem.
Ich hasse es zu sagen, aber keiner der anderen Lösungen ist hier in Bezug korrekt geschrieben a zu sein „sichere Session-ID.“
# pip install M2Crypto
import base64, M2Crypto
def generate_session_id(num_bytes = 16):
return base64.b64encode(M2Crypto.m2.rand_bytes(num_bytes))
Weder uuid()
oder os.urandom()
sind eine gute Wahl für Session-IDs zu generieren. Beide können zufällige Ergebnisse erzeugen, aber Random bedeutet nicht, dass es ist sicher aufgrund der Entropie. Siehe "How to Crack a Linear Congruential Generator" von Haldir oder NIST's resources on Random Number Generation. Wenn Sie noch eine UUID verwenden möchten, dann eine UUID verwenden, die mit einem guten anfänglichen Zufallszahl generiert wurde:
import uuid, M2Crypto
uuid.UUID(bytes = M2Crypto.m2.rand_bytes(num_bytes)))
# UUID('5e85edc4-7078-d214-e773-f8caae16fe6c')
oder:
# pip install pyOpenSSL
import uuid, OpenSSL
uuid.UUID(bytes = OpenSSL.rand.bytes(16))
# UUID('c9bf635f-b0cc-d278-a2c5-01eaae654461')
m2crypto ist am besten OpenSSL API in Python atm als pyOpenSSL erscheint nur beibehalten werden, um Legacy-Anwendungen zu unterstützen.
Diese Zitate über UUID-Probleme sind hilfreich. Danke für das Posten. Frage: Was denkst du, ist der beste Weg, um eine Session ID zu generieren? Insbesondere mit den Fehlern, die Sie in UUID-Implementierungen angeben, wie würden Sie es anders machen? Ich schreibe gerade so etwas und versuche, den besten Ansatz zu finden. Es muss auch fehlertolerant sein - z. B. kann es nicht von einer Verbindung mit einem Datenbankserver abhängig sein. – ratsbane
Jedes der obigen Beispiele würde funktionieren. Der Schlüssel ist die Verwendung eines guten Zufallszahlengenerators, der mit "kryptografisch ausreichender Entropie" gefüllt ist. Abgesehen von der Ästhetik und der Größe der Darstellung gibt es keinen Unterschied zwischen einer Codierung eines ausreichend zufälligen Wertes als "Base64" - oder "UUID" - oder sogar einer hexadezimalen Zeichenkette. Jedem das Seine. Ich persönlich bevorzuge Base64 aus Gründen der Größe. – Sean
Danke. Das scheint gesund zu sein. Ich schrieb es heute Nachmittag mit – ratsbane
Das ist, was ich gesucht habe! – Alex
Aber das ist nicht sehr zufällig. – Gumbo
@Gumbo: bitte ausarbeiten? – saffsd