Domanda

Ho una stringa come questa:

String A: [ 12234_1_Hello'World_34433_22acb_4554344_accCC44 ]

Vorrei crittografare String A per essere utilizzato in un URL pulita. qualcosa di simile a questo:

String B: [ cYdfkeYss4543423sdfHsaaZ ]

C'è un'API codificare in python, data stringa A, restituisce String B? C'è un'API decodifica in python, data stringa B, restituisce String Un?

È stato utile?

Soluzione

Un modo di fare la codifica / decodifica è quello di usare il pacchetto Base64, per un esempio:

import base64
import sys

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

decoded = base64.b64decode(encoded)
print decoded

E 'quello che cercavi? Con il vostro caso particolare si ottiene:

ingresso: 12234_1_Hello'World_34433_22acb_4554344_accCC44

codificato: MTIyMzRfMV9IZWxsbydXb3JsZF8zNDQzM18yMmFjYl80NTU0MzQ0X2FjY0NDNDQ =

decodificato: 12234_1_Hello'World_34433_22acb_4554344_accCC44

Altri suggerimenti

Si noti che theres una differenza enorme tra la codifica e la crittografia.

se si desidera inviare i dati sensibili, allora non utilizzare la codifica di cui sopra;)

Sei dopo la crittografia, compressione, o semplicemente urlencoding? La stringa può essere passata dopo urlencoding, ma che non ce la farà più piccolo come nel tuo esempio. La compressione potrebbe ridurlo, ma si sarebbe ancora bisogno di URLEncode il risultato.

Avete veramente bisogno di nascondere i dati di stringa dal visualizzatore (ad esempio i dati sensibili, non dovrebbe essere visualizzabile da qualcuno leggendo l'URL sopra la spalla)?

per renderlo davvero breve -> solo inserire una riga nel database. Conservare qualcosa di simile a una lista di tuple (id auto_increment, url). Poi si può base64 codificare l'id di ottenere un "URL proxy". Decodificarlo decodificando l'id e guardare l'URL corretto nel database. Oppure, se non ti dispiace gli identificatori cercando sequenziale, basta usare i numeri.

Stai cercando di criptare la stringa o codificare per rimuovere i caratteri non validi per gli URL? In quest'ultimo caso, è possibile utilizzare urllib.quote :

>>> 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"

Il modulo base64 fornisce codifica e decodifica per una stringa e da basi differenti, poiché pitone 2.4.

In ti esempio, è necessario effettuare le seguenti operazioni:

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

Per un pieno API: http://docs.python.org/library/base64.html

È difficile ridurre le dimensioni di una stringa e preservare contenuto arbitrario.

È necessario limitare i dati a qualcosa che si può utilmente comprimere.

L'alternativa è quella di fare quanto segue.

  1. Salva "tutti gli argomenti del URL" in una riga di database.

  2. Assegna una chiave GUID per questa raccolta di argomenti.

  3. Quindi fornire la chiave GUID accorciato.

Un altro metodo che potrebbe anche ridurre la stringa sarebbe quello di calcolare l'hash md5 / sha1 della stringa (concatenato con un seme, se si voleva):

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

In teoria si dovrebbe ottenere un insieme di stringhe con pochissime le collisioni e con una lunghezza fissa. Il hashlib biblioteca ha una serie di diverse funzioni di hash che è possibile utilizzare in questo modo, con diverse potenzialità.

Edit: Hai anche detto che avevi bisogno di una stringa reversibili, quindi questo non avrebbe funzionato per quello. AFAIK, tuttavia, molte piattaforme web che utilizzano gli URL semplificati come te sembrano voler implementare funzioni di hash per calcolare l'uso di un URL accorciato e quindi memorizzare tale URL insieme ad altri dati della pagina per fornire la funzionalità di ricerca inversa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top