Django, Python и шифрование ссылок - PullRequest
5 голосов
/ 18 февраля 2010

Мне нужно организовать какое-то шифрование для генерации пользовательских ссылок. Пользователи будут щелкать эту ссылку, и в каком-либо другом представлении связанная расшифровка ссылки с зашифрованной строкой будет расшифрована, и результат будет возвращен.

Для этого мне нужна какая-то функция шифрования, которая использует число (или строку), которое является первичным ключом моего выбранного элемента, привязанного к учетной записи пользователя, также потребляет некое начальное значение и генерирует код шифрования, будет расшифрован на другой странице.

так как то так

my_items_pk = 36 #primary key of an item
seed = "rsdjk324j23423j4j2" #some string for crypting
encrypted_string = encrypt(my_items_pk,seed)
#generates some crypted string such as "dsaj2j213jasas452k41k"
and at another page:
decrypt_input = encrypt(decypt,seed)
print decrypt_input
#gives 36

Я хочу, чтобы моим "семенем" была какая-то первичная переменная (а не какой-то класс) для этой цели (т. Е. Некоторое число или строка).

Как мне этого добиться под python и django?

Ответы [ 2 ]

8 голосов
/ 18 февраля 2010

По сути, нет никаких алгоритмов шифрования, встроенных в Python. Однако вы можете захотеть взглянуть на Python Cryptography Toolkit (PyCrypt). Я только возился с этим, но на него есть ссылки в документации Python по криптографическим службам . Вот пример того, как вы можете зашифровать строку с помощью AES, используя PyCrypt:

from Crypto.Cipher import AES
from urllib import quote

# Note that for AES the key length must be either 16, 24, or 32 bytes
encryption_obj = AES.new('abcdefghijklmnop')
plain = "Testing"

# The plaintext must be a multiple of 16 bytes (for AES), so here we pad it
# with spaces if necessary.
mismatch = len(plain) % 16
if mismatch != 0:
  padding = (16 - mismatch) * ' '
  plain += padding

ciph = encryption_obj.encrypt(plain)

# Finally, to make the encrypted string safe to use in a URL we quote it
quoted_ciph = quote(ciph)

Затем вы сделаете эту часть своего URL, возможно, частью запроса GET.

Чтобы расшифровать, просто переверните процесс; при условии, что encryption_obj создан, как указано выше, и что вы получили соответствующую часть URL, это будет сделано:

from urllib import unquote

# We've already created encryption_object as shown above

ciph = unquote(quoted_ciph)
plain = encryption_obj.decrypt(ciph)

Вы также можете рассмотреть другой подход: одним простым методом будет хеширование первичного ключа (с солью, если хотите) и сохранение хеша и pk в вашей базе данных. Дайте пользователю хеш как часть его ссылки, и когда он вернется и представит хеш, найдите соответствующий pk и верните соответствующий объект. (Если вы хотите пойти по этому пути, посмотрите встроенную библиотеку hashlib .)

Например, у вас есть что-то вроде этого, определенное в models.py:

class Pk_lookup(models.Model):
  # since we're using sha256, set the max_length of this field to 32
  hashed_pk = models.CharField(primary_key=True, max_length=32)
  key = models.IntegerField()

И вы бы сгенерировали хеш в представлении, используя что-то вроде следующего:

import hashlib
import Pk_lookup

hash = hashlib.sha256()
hash.update(str(pk)) # pk has been defined previously
pk_digest = hash.digest()

lookup = Pk_lookup(hashed_pk=pk_digest,key=pk)
lookup.save()

Обратите внимание, что вам также придется процитировать эту версию; если вы предпочитаете, вы можете использовать hexdigest() вместо digest (вам не придется заключать в кавычки результирующую строку), но вам придется настроить длину поля до 64.

0 голосов
/ 26 мая 2014

Django имеет функции для этого сейчас. Смотри https://docs.djangoproject.com/en/dev/topics/signing/

Цитирование этой страницы:

"Django предоставляет как низкоуровневый API для подписи значений, так и высокоуровневый API для установки и чтения подписанных файлов cookie, одно из самых распространенных применений подписи в веб-приложениях.

Вы также можете найти подписи полезными для:

  • Создание URL-адресов «восстановить мою учетную запись» для отправки пользователям, которые потеряли свой пароль.
  • Обеспечение того, чтобы данные, хранящиеся в скрытых полях формы, не были изменены.
  • Создание одноразовых секретных URL-адресов для временного доступа к защищенному ресурсу, например, к загружаемому файлу, за который заплатил пользователь. "
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...