2009-05-17 5 views
4

Ich habe eine Zeichenfolge wie folgt:Wie codiert und entschlüsselt man einen String mit Python zur Verwendung in einer URL?

String A: [ 12234_1_Hello'World_34433_22acb_4554344_accCC44 ] 

Ich möchte String A verschlüsseln, in einem sauberen URL verwendet werden. so etwas wie dieses:

String B: [ cYdfkeYss4543423sdfHsaaZ ] 

Gibt es eine kodieren API in Python, String A gegeben, gibt es String B? Gibt es eine Dekodier-API in Python, die String B liefert, gibt String A?

+2

Bitte beachten Sie, Verschlüsselung („Ich möchte ... verschlüsseln“) nicht kodiert ("Gibt es eine API codieren ... "). Sie haben eine Antwort akzeptiert, die die base64-Codierung verwendet. Dies ist keine Verschlüsselung, d. H. Diese Daten sind nicht sicher. – hiwaylon

+0

@ VN44CA, eine verschlüsselte Abfragezeichenfolge und eine saubere URL sind nicht die gleichen Bedenken. Eine verschlüsselte Abfragezeichenfolge ist von Natur aus nicht sauber. So wie es aussieht, ist die Frage sehr schlecht formuliert. –

Antwort

9

Eine Möglichkeit, den Encoder/Decoder zu tun ist, um das Paket base64 zu verwenden, zum Beispiel:

import base64 
import sys 

encoded = base64.b64encode(sys.stdin.read()) 
print encoded 

decoded = base64.b64decode(encoded) 
print decoded 

Ist es das, was Sie suchen? Mit Ihrem speziellen Fall erhalten Sie:

Eingang: 12234_1_Hello'World_34433_22acb_4554344_accCC44

codiert: MTIyMzRfMV9IZWxsbydXb3JsZF8zNDQzM18yMmFjYl80NTU0MzQ0X2FjY0NDNDQ =

decodiert: 12234_1_Hello'World_34433_22acb_4554344_accCC44

2

Das base64-Modul bietet die Codierung und Decodierung für eine Zeichenfolge zu und von verschiedene Basen, seit Python 2.4.

In Ihrem Beispiel, würden Sie wie folgt vor:

import base64 
string_b = base64.b64encode(string_a) 
string_a = base64.b64decode(string_b) 

Für vollständige API: http://docs.python.org/library/base64.html

+0

Ich bekomme 'TypeError: 'str' unterstützt nicht die Pufferschnittstelle ' – alvas

+0

Meine Zeichenkette:' A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | Adj | Adm | Adv | Ass | Bart | Bldg | Brig | Bros | Capt | Cmdr | Col | Comdr | Con | Corp | Cpl | DR | Dr | Drs | Ens | Gen | Gov | Hon | Hr | Hosp | Insp | Lt | MM | MR | MRS | MS | Maj | Herren | Mlle | Mme | Mr | Frau | Frau | Msgr | Op | Ord | Pfc | Ph | Prof | Pvt | Rep | Rep | Res | Rev | Rt | Sen | Sens | Sfc | Sgt | Sr | St | Sup | | Surg | v | vs | ie | rev | eg | No | # NUMERIC_ONLY # | Nos | Kunst # NUMERIC_ONLY # | Nr | pp # NUMERIC_ONLY # | Jan | Feb | Mar | Apr | Jun | Jul | Aug | Sep | Okt | Nov | Dez ' – alvas

4

Suchen Sie die Zeichenfolge zu verschlüsseln oder kodieren es für Urls ungültige Zeichen zu entfernen? letztere Wenn Sie urllib.quote verwenden:

>>> quoted = urllib.quote("12234_1_Hello'World_34433_22acb_4554344_accCC44") 
>>> quoted 
'12234_1_Hello%27World_34433_22acb_4554344_accCC44' 

>>> urllib.unquote(quoted) 
"12234_1_Hello'World_34433_22acb_4554344_accCC44" 
+0

Diese Antwort ist großartig, weil sie tatsächlich die Antwort gibt Frage, wie im Titel gefragt (die Frage selbst ist ziemlich inkohärent), und was viele Suchende auf der Suche nach dieser Seite wollen. –

5

Sind Sie nach der Verschlüsselung, Komprimierung, oder einfach nur urlencoding? Die Zeichenfolge kann nach dem Urlencoding übergeben werden, aber dadurch wird sie nicht kleiner als in Ihrem Beispiel. Durch die Komprimierung kann die Größe zwar verringert werden, Sie müssen das Ergebnis jedoch immer noch mit dem URL-Code versehen.

Müssen Sie tatsächlich die Zeichenkettendaten aus dem Viewer ausblenden (z. B. sensible Daten, sollten nicht sichtbar sein, wenn jemand die URL über Ihre Schulter liest)?

+0

Keine Sicherheitsprobleme. Ich habe gerade darüber nachgedacht, die Saite zufällig zu mischen und sie etwas zu verkleinern. Ich habe dies auf Kijiji.com gesehen, wo sie eine zufällige Zeichenfolge an das Ende ihrer Slug anhängen. Ich bin mir sicher, dass sie so Argumente herumreichen. Ich dachte, es wäre cool, sowas zu benutzen. http://bayarea.kijiji.com/f-Jobs-Construction-trades-W0QQCatIdZ100060 http://bayarea.kijiji.com/f-Jobs-Construction-trades-Peninsula-W0QQCatIdZ100060QQLocationZ2600043 Ich mag würde um alle Argumente in der URL zu haben, wenn die Leute URLs kopieren und mailen, sehen ihre Freunde das Endergebnis ohne Cookies. Thanks – un33k

+2

Sie könnten fälschlicherweise speichern Daten mit Bezug darauf. Das heißt, die kurze Zeichenfolge, die Sie in der URL sehen, ist tatsächlich eine Sitzungs-ID und die Daten, auf die sie verweist, werden auf dem Server gespeichert. Ich könnte mich irren, ich kenne keine Details über diese Seite, aber es ist üblich genug. – JimG

5

Um es wirklich kurz zu machen -> fügen Sie einfach eine Zeile in die Datenbank ein. Speichern Sie so etwas wie eine Liste von (id auto_increment, url) Tupeln. Dann können Sie base64 die ID codieren, um eine "Proxy-URL" zu erhalten. Dekodieren Sie es, indem Sie die ID dekodieren und die richtige URL in der Datenbank nachschlagen. Oder wenn es Ihnen nichts ausmacht, wenn die Bezeichner sequenziell aussehen, verwenden Sie einfach die Zahlen.

+0

Beat mich um eine Minute! –

2

Es ist schwierig, die Größe einer Zeichenfolge zu reduzieren und beliebigen Inhalt beizubehalten.

Sie müssen die Daten auf etwas beschränken, das Sie sinnvoll komprimieren können.

Ihre Alternative besteht darin, Folgendes zu tun.

  1. Speichern Sie "alle Argumente in der URL" in einer Datenbankzeile.

  2. Weisen Sie dieser Argumentsammlung einen GUID-Schlüssel zu.

  3. Geben Sie dann den abgekürzten GUID-Schlüssel an.

+0

Die Alternative würde einen zusätzlichen Treffer in der Datenbank erfordern, richtig? Ich sehe viele Seiten dabei, muss nur herausfinden, wie? – un33k

+0

Extra relativ zu was? Wenn Sie Benutzer authentifizieren und die Berechtigung prüfen, haben Sie dort Abfragen. Wenn Ihr Datenmodell etwas anderes als eine triviale Tabelle ist, kann es sich um mehrere Abfragen handeln.Das Speichern der "Abfrage" in der Datenbank ist relativ einfach zu verwalten. –

1

andere Methode, die auch die Zeichenfolge verkürzen würde die md5/SHA1-Hash der Zeichenfolge (mit einem Samen verketteten wenn man wollte) wäre zu berechnen:

import hashlib 
>>> hashlib.sha1("12234_1_Hello'World_34433_22acb_4554344_accCC44").hexdigest() 
'e1153227558aadc00a2e90b5013fdd6b0804fdfb' 

In der Theorie sollten Sie eine bekommen Satz von Strings mit sehr wenigen Kollisionen und mit einer festen Länge. Die Bibliothek hashlib verfügt über ein Array verschiedener Hash-Funktionen, die Sie auf diese Weise verwenden können, mit unterschiedlichen Ausgabegrößen.

Edit: Sie sagten auch, dass Sie eine reversible Zeichenfolge benötigt, so dass dies nicht funktionieren würde. Afaik, jedoch, viele Web-Plattformen, die saubere URLs verwenden, wie Sie scheinen zu implementieren Hash-Funktionen zu verwenden, um eine verkürzte URL zu berechnen und speichern Sie diese URL zusammen mit den anderen Daten der Seite, um die Reverse-Lookup-Funktion bereitzustellen.

+0

Ist 'hoshlib.sha1' reversibel? – alvas

10

beachten Sie, dass es einen großen Unterschied zwischen Codierung und Verschlüsselung gibt.

wenn Sie sensible Daten senden möchten, dann die oben genannten Codierung nicht verwenden;)

Verwandte Themen