По сути, нет никаких алгоритмов шифрования, встроенных в 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.