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下实现这一目标?
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.
| 归档时间: |
|
| 查看次数: |
5103 次 |
| 最近记录: |