2010-02-18 10 views
5

Potrzebuję zorganizować pewien rodzaj encrpytion do generowania linków określonych przez użytkownika. Użytkownicy będą klikać ten link, a w innym widoku powiązany link z zaszyfrowanym łańcuchem zostanie odszyfrowany, a wynik zostanie zwrócony.django, python i szyfrowanie łącza

Do tego potrzebuję jakiejś funkcji szyfrowania, która zużywa numer (lub ciąg znaków), który jest kluczem podstawowym mojego wybranego elementu, który jest powiązany z kontem użytkownika, a także pochłania pewien rodzaj materiału źródłowego i generuje kod szyfrujący który zostanie odszyfrowany na innej stronie.

więc coś w tym

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 

chcę mój „seed” być jakiś rodzaj zmiennej podstawowej (nie jakaś klasa) do tego celu (tj niektóre liczba lub ciąg znaków).

Jak mogę to osiągnąć pod pytonem i django?

+0

Dlaczego nie wystarczy użyć do tego' session' ? – voyager

+0

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

Odpowiedz

8

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.

+0

dzięki peppergrower! – Hellnar

+0

Próbowałem twojej metody i dodałem cytowany ciąg znaków na adres URL, ale django się nie udało Szczegóły można zobaczyć w tym wątku: http://stackoverflow.com/questions/8685139/django-cant-have-quoted-characters-in-urls –

0

Django ma teraz funkcje do tego. Zobacz https://docs.djangoproject.com/en/dev/topics/signing/

Cytując tę ​​stronę:

„Django zapewnia zarówno API niskiego poziomu dla wartości podpisania i API wysokiego poziomu dla ustawiania i odczytu podpisane pliki cookie, jeden z najbardziej powszechnych zastosowań podpisania w aplikacjach WWW .

Można również znaleźć podpisania przydatna w następujących przypadkach:

  • rodzenie „Recover My Account” adresów URL do wysyłania do użytkowników, którzy utracili swoje hasło.
  • Zapewnienie, że dane przechowywane w ukrytych polach formularza nie zostały zmienione.
  • Generowanie jednorazowych tajne adresy URL umożliwiający tymczasowy dostęp do chronionego zasobu, do -. Przykładowo plik do pobrania, które użytkownik zapłacił za”