django,python和链接加密

Hel*_*nar 5 python encryption django

我需要安排某种加密来生成用户特定的链接.用户将单击此链接,在其他视图中,将解密与加密字符串相关的链接,并返回结果.

为此,我需要某种加密函数,它使用一个数字(或一个字符串),这是我选择的项目的主键,绑定到用户帐户,也消耗某种种子并生成将被解密的加密代码在其他一些页面.

所以这样的事情

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
Run Code Online (Sandbox Code Playgroud)

为此,我希望我的"种子"成为某种主要变量(不是某些类)(即一些数字或字符串).

如何在python和django下实现这一目标?

mjj*_*son 8

Python内置了加密算法本身.但是,您可能希望查看Python Cryptography Toolkit(PyCrypt).我只修补它,但在Python的加密服务文档中引用了它.以下是使用PyCrypt如何使用AES加密字符串的示例:

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)
Run Code Online (Sandbox Code Playgroud)

然后,您可以将此部分作为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)
Run Code Online (Sandbox Code Playgroud)

您也可以考虑一种不同的方法:一种简单的方法是散列主键(如果您愿意,使用salt)并将哈希和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()
Run Code Online (Sandbox Code Playgroud)

并且您将使用以下内容在视图中生成哈希:

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()
Run Code Online (Sandbox Code Playgroud)

请注意,您还必须引用此版本; 如果您愿意,可以使用hexdigest()而不是digest(您不必引用结果字符串),但您必须将字段长度调整为64.