gpt4 book ai didi

python - django、python 和链接加密

转载 作者:太空狗 更新时间:2023-10-30 00:52:26 25 4
gpt4 key购买 nike

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

为此,我需要某种加密函数,它使用一个数字(或字符串)作为绑定(bind)到用户帐户的所选项目的主键,还使用某种种子并生成加密代码将在其他页面解密。

像这样

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

为此,我希望我的“种子”成为某种主要变量(而不是某个类)(即某个数字或字符串)。

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

最佳答案

Python 本身没有内置加密算法。但是,您可能想查看 Python Cryptography Toolkit (PyCrypt)。我只是对它进行了修补,但在 Python 文档中引用了它 cryptographic services .下面是一个示例,说明如何使用 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)

然后您可以将这部分作为您的 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()

然后您将使用类似以下内容在 View 中生成哈希:

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。

关于python - django、python 和链接加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2291176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com