Nie ma żadnych algorytmów szyfrowania, wbudowanych w Pythonie. Możesz jednak spojrzeć na Python Cryptography Toolkit (PyCrypt). Ja tylko majstrowałem przy tym, ale jest to wspomniane w dokumentacji Pythona pod adresem cryptographic services. Oto przykład, w jaki sposób można zaszyfrować ciąg z AES z użyciem 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)
Można by następnie uczynić tę część adresu URL, być może jako część żądania GET.
Aby odszyfrować, po prostu odwróć proces; zakładając, że encryption_obj
tworzony jest jak powyżej, a które zostały pobrane odpowiednią część adresu URL, byłoby to zrobić:
from urllib import unquote
# We've already created encryption_object as shown above
ciph = unquote(quoted_ciph)
plain = encryption_obj.decrypt(ciph)
też może rozważyć inne podejście: jedna prosta metoda byłoby hash podstawowym klucz (z solą, jeśli chcesz) i przechowuj hash i pk w bazie danych. Podaj użytkownikowi mieszanie jako część swojego łącza, a kiedy powrócą i pokaż hasz, wyszukaj odpowiedni pk i zwróć odpowiedni obiekt. (. Jeśli chcesz pójść tą drogą, sprawdź Wbudowana biblioteka hashlib)
Jako przykład, można by mieć coś takiego zdefiniowane w 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()
a ty” d wygenerować skrót w widoku, korzystając z następujących opcji:
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()
Należy pamiętać, że trzeba zacytować tę wersję; jeśli wolisz, możesz użyć hexdigest()
zamiast digest
(nie musisz cytować wynikowego ciągu znaków), ale musisz dostosować długość pola do 64.
Dlaczego nie wystarczy użyć do tego' session' ? – voyager
Myślę, że masz na myśli sprawdzanie autentyczności użytkownika, tak, rzeczywiście będę ich używać, ale także nie chcę pokazywać elementom pks użytkownikom i zamiast tego je kryptować – Hellnar