Python und zufällige Schlüssel von 21 Char max

7

Ich benutze eine API, die einen Namen von 21 Zeichen hat, um eine interne Sitzung darzustellen, die eine Lebensdauer von ungefähr "zwei Tagen" hat. Ich möchte, dass der Name nicht sinnvoll ist, wenn man eine Art Hasing benutzt? MD5 erzeugt 40 Zeichen, gibt es etwas anderes, das ich verwenden könnte?

Zur Zeit verwende ich 'userid [: 10]' + Erstellungszeit: ddhhmmss + zufällige 3 Zeichen.

Danke,

    
coulix 07.03.2009, 10:36
quelle

5 Antworten

23

Wenn ich Ihre Frage richtig gelesen habe, möchten Sie ein beliebiges Bezeichner-Token generieren, das maximal 21 Zeichen lang sein darf. Muss es sehr resistent gegen Raten sein? Das Beispiel, das Sie angegeben haben, ist nicht "kryptographisch stark", da es dadurch erraten werden kann, dass weniger als die Hälfte des gesamten möglichen Schlüsselraums gesucht wird.

Sie sagen nicht, ob die Zeichen alle 256 ASCII-Zeichen sein können oder ob sie beispielsweise auf druckbares ASCII (33-127, einschließlich) oder einen kleineren Bereich beschränkt sein müssen.

Es gibt ein Python-Modul, das für UUID (Universals Unique IDentifiers) entwickelt wurde. Wahrscheinlich möchten Sie uuid4, das eine zufällige UUID generiert und OS-Unterstützung verwendet, falls verfügbar (unter Linux, Mac, FreeBSD und wahrscheinlich anderen).

%Vor%

16 zufällige Bytes sind sehr unberechenbar, und es gibt keine Notwendigkeit, die vollen 21 Bytes zu verwenden, die Ihre API erlaubt, wenn alles was Sie wollen, eine undurchsichtige undurchsichtige Kennung ist.

Wenn Sie solche Rohbytes nicht verwenden können, was wahrscheinlich eine schlechte Idee ist, weil es in Logs und anderen Debug-Nachrichten schwieriger zu verwenden und mit dem Auge schwerer zu vergleichen ist, dann konvertieren Sie die Bytes in etwas leserlicheres mit Base-64-Codierung, mit dem Ergebnis auf 21 (oder was auch immer) Bytes gehackt:

%Vor%

Dies gibt Ihnen eine extrem hohe Qualität zufällige Zeichenfolge der Länge 21.

Sie mögen das "+" oder "/", das in einer Base-64-Zeichenfolge enthalten sein kann, nicht mögen, da ohne ordnungsgemäße Umgehung URLs beeinträchtigt werden können. Da Sie bereits denken, "zufällige 3 Zeichen" zu verwenden, glaube ich nicht, dass dies eine Sorge von Ihnen ist. Wenn dies der Fall ist, könnten Sie diese Zeichen durch etwas anderes ersetzen ("-" und "." Könnten funktionieren), oder entfernen Sie sie, falls vorhanden.

Wie andere darauf hingewiesen haben, könnten Sie .encode ("hex") verwenden und die hexadezimale Entsprechung erhalten, aber das sind nur 4 Bits von Zufälligkeit / Zeichen. * max. 21 Zeichen ergeben 84 Bit an Zufälligkeit statt zweimal. Jedes Bit verdoppelt Ihren Schlüsselraum und macht den theoretischen Suchraum viel kleiner. Um den Faktor 2E24 kleiner.

Ihr Schlüsselraum ist immer noch 2E24 groß, sogar mit Hexadezimalkodierung, also denke ich, dass es eher eine theoretische Sorge ist. Ich würde mir keine Sorgen machen, dass Leute Brute-Force-Angriffe gegen Ihr System durchführen.

Bearbeiten :

P.S .: Die Funktion uuid.uuid4 verwendet libuuid, falls verfügbar. Das erhält seine Entropie von os.urandom (falls vorhanden) ansonsten von der aktuellen Uhrzeit und der lokalen Ethernet-MAC-Adresse. Wenn libuuid nicht verfügbar ist, ruft die uuid.uuid4-Funktion die Bytes direkt von os.urandom (falls verfügbar) ab, andernfalls wird das Zufallsmodul verwendet. Das Zufallsmodul verwendet einen Standardstartwert basierend auf os.urandom (falls verfügbar), ansonsten einen Wert basierend auf der aktuellen Zeit. Das Prüfen findet für jeden Funktionsaufruf statt. Wenn Sie also os.urandom nicht haben, ist der Aufwand etwas größer als erwartet.

Nehmen Sie Ihre Nachricht mit nach Hause? Wenn Sie wissen, dass Sie os.urandom haben, dann könnten Sie

tun %Vor%

Wenn Sie sich jedoch keine Sorgen über die Verfügbarkeit machen möchten, verwenden Sie das Uuid-Modul.

    
Andrew Dalke 07.03.2009, 12:26
quelle
4

Die hexadezimale Darstellung von MD5 hat eine sehr geringe Zufälligkeit: Sie erhalten nur 4 Bit Entropie pro Zeichen.

Verwenden Sie zufällige Zeichen, etwa wie folgt:

%Vor%

Geben Sie in der Auswahl alle zulässigen Zeichen ein.

Wenn Sie eine echte Hash-Funktion wie SHA1 verwenden, erhalten Sie auch schöne Ergebnisse. Bei richtiger Verwendung scheint die zusätzliche Komplexität und der CPU-Verbrauch für Ihre Anforderungen nicht gerechtfertigt. Sie möchten nur eine zufällige Zeichenfolge.

    
kmkaplan 07.03.2009 10:45
quelle
2

Warum nimmst du nicht zuerst 21 Zeichen von md5 oder SHA1 Hash?

    
Alexander Lebedev 07.03.2009 10:38
quelle
2

Das base64-Modul kann eine URL-sichere Codierung durchführen. Also, wenn nötig, statt

%Vor%

könntest du

machen %Vor%

und, bequem, um

zurück zu konvertieren %Vor%     
Neil 14.10.2009 17:03
quelle
0

Zeichen oder Bytes? Wenn es willkürliche Zeichenfolgen benötigt, können Sie einfach die Bytes verwenden und sich nicht darum kümmern, in lesbare Zeichen zu expandieren (für die base64 wäre sowieso besser als hexadezimal).

MD5 generiert 16 Zeichen, wenn Sie die hexadezimale Erweiterung nicht verwenden. SHA1 generiert 20 unter der gleichen Bedingung.

%Vor%

Wenige zusätzliche Bytes sind danach erforderlich.

    
Devin Jeanpierre 07.03.2009 10:54
quelle

Tags und Links