Django, Python y cifrado de enlace.

Necesito organizar algún tipo de cifrado para generar enlaces específicos del usuario. Los usuarios harán clic en este enlace y, en alguna otra vista, el enlace relacionado con la cadena cifrada se descifrará y se devolverá el resultado.

Para esto, necesito algún tipo de función de cifrado que consume un número (o una cadena) que es la clave principal de mi elemento seleccionado que está vinculado a la cuenta del usuario, también consume algún tipo de semilla y genera un código de cifrado que se descifrará en alguna otra página.

así que algo como esto

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 

Quiero que mi “semilla” sea algún tipo de variable primaria (no una clase) para este propósito (es decir, algún número o cadena).

¿Cómo puedo lograr esto bajo python y django?

No hay algoritmos de cifrado, per se, integrados en Python. Sin embargo, es posible que desee ver el kit de herramientas de criptografía de Python (PyCrypt). Solo he jugado con eso, pero está referenciado en la documentación de Python sobre servicios criptográficos . Aquí hay un ejemplo de cómo podría cifrar una cadena con AES usando 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) 

Luego debería hacer esta parte de su URL, tal vez como parte de una solicitud GET.

Para descifrar, simplemente revertir el proceso; Suponiendo que encryption_obj se cree como anteriormente, y que haya recuperado la parte relevante de la URL, esto lo haría:

 from urllib import unquote # We've already created encryption_object as shown above ciph = unquote(quoted_ciph) plain = encryption_obj.decrypt(ciph) 

También puede considerar un enfoque diferente: un método simple sería hacer un hash de la clave principal (con un salt, si lo desea) y almacenar el hash y pk en su base de datos. Proporcione al usuario el hash como parte de su enlace, y cuando regrese y presente el hash, busque el pk correspondiente y devuelva el objeto apropiado. (Si desea ir por esta ruta, consulte la biblioteca incorporada hashlib ).

Como ejemplo, tendrías algo como esto definido en 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() 

Y generarías el hash en una vista usando algo como lo siguiente:

 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() 

Tenga en cuenta que también tendría que citar esta versión; si lo prefiere, puede usar hexdigest() lugar del digest (no tendría que citar la cadena resultante), pero tendrá que ajustar la longitud del campo a 64.

Django tiene características para esto ahora. Consulte https://docs.djangoproject.com/en/dev/topics/signing/

Citando esa página:

“Django proporciona una API de bajo nivel para valores de firma y una API de alto nivel para configurar y leer cookies firmadas, uno de los usos más comunes de la firma en aplicaciones web.

También puede encontrar la firma útil para lo siguiente:

  • Generando las URL de “recuperar mi cuenta” para enviarlas a los usuarios que han perdido su contraseña.
  • Asegurar que los datos almacenados en campos de formulario ocultos no hayan sido manipulados.
  • Generar URL secretas únicas para permitir el acceso temporal a un recurso protegido, por ejemplo, un archivo descargable que un usuario ha pagado “.