Как можно кодировать и декодировать строку с помощью Python для использования в URL? - PullRequest
4 голосов
/ 18 мая 2009

У меня есть такая строка:

String A: [ 12234_1_Hello'World_34433_22acb_4554344_accCC44 ]

Я хотел бы зашифровать строку A для использования в чистом URL. как то так:

String B: [ cYdfkeYss4543423sdfHsaaZ ]

Есть ли в Python API кодирования, учитывая строку A, он возвращает строку B? Есть ли в Python API декодирования, учитывая строку B, он возвращает строку A?

Ответы [ 8 ]

11 голосов
/ 26 июля 2009

обратите внимание, что существует огромная разница между кодированием и шифрованием.

если вы хотите отправить конфиденциальные данные, не используйте кодировку, указанную выше;)

9 голосов
/ 18 мая 2009

Одним из способов кодирования / декодирования является использование пакета base64, например:

import base64
import sys

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

decoded = base64.b64decode(encoded)
print decoded

Это то, что вы искали? В вашем конкретном случае вы получите:

ввод: 12234_1_Hello'World_34433_22acb_4554344_accCC44

кодированный: MTIyMzRfMV9IZWxsbydXb3JsZF8zNDQzM18yMmFjYl80NTU0MzQ0X2FjY0NDNDQ =

расшифровано: 12234_1_Hello'World_34433_22acb_4554344_accCC44

5 голосов
/ 18 мая 2009

Чтобы сделать его действительно коротким -> просто вставьте строку в базу данных. Сохраните что-то вроде списка (id auto_increment, url) кортежей. Затем вы можете base64 кодировать идентификатор, чтобы получить "URL прокси". Расшифруйте его, расшифровав идентификатор и ища правильный URL в базе данных. Или, если вы не возражаете, идентификаторы выглядят последовательно, просто используйте цифры.

5 голосов
/ 18 мая 2009

Вы после шифрования, сжатия или просто urlencoding? Строка может быть передана после urlencoding, но это не сделает ее меньше, как в вашем примере. Сжатие может уменьшить его, но вам все равно придется кодировать результат.

Вам действительно нужно скрыть строковые данные от средства просмотра (например, конфиденциальные данные, не должны просматриваться кем-то, кто читает URL через ваше плечо)?

4 голосов
/ 18 мая 2009

Вы хотите зашифровать строку или закодировать ее, чтобы удалить недопустимые символы для URL? Если последнее, вы можете использовать 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"
2 голосов
/ 18 мая 2009

Трудно уменьшить размер строки и сохранить произвольный контент.

Вы должны ограничить данные тем, что сможете с пользой сжать.

Ваша альтернатива - сделать следующее.

  1. Сохранить «все аргументы в URL» в строке базы данных.

  2. Назначьте ключ GUID для этой коллекции аргументов.

  3. Затем предоставьте этот сокращенный ключ GUID.

2 голосов
/ 18 мая 2009

Модуль base64 обеспечивает кодирование и декодирование для строки в различные базы, начиная с python 2.4.

В вашем примере вы бы сделали следующее:

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

Для полного API: http://docs.python.org/library/base64.html

1 голос
/ 18 мая 2009

Другим методом, который также укорачивает строку, было бы вычисление хеша md5 / sha1 строки (объединенного с семенем, если хотите):

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

Теоретически вы должны получить набор строк с очень небольшим количеством столкновений и с фиксированной длиной. Библиотека hashlib содержит массив различных хеш-функций, которые вы можете использовать таким образом, с разными размерами вывода.

Edit: Вы также сказали, что вам нужна обратимая строка, так что это не сработает для этого. Однако, на самом деле, многие веб-платформы, которые используют чистые URL-адреса, как вы, похоже, хотите реализовать, используют хеш-функции для вычисления сокращенного URL-адреса, а затем сохраняют этот URL-адрес вместе с другими данными страницы для обеспечения возможности обратного просмотра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...