Django中的加密和解密

Django中的加密和解密,django,encryption,unsubscribe,Django,Encryption,Unsubscribe,我正在努力在我的电子邮件上实现“取消订阅链接”。我正在为未订阅的用户维护一个表 我想知道的电子邮件地址,一旦用户点击取消订阅链接。当然,我不能将其作为get参数发送,因为可以很容易地修改它 一个例子是,我想给我的10个朋友发送电子邮件,每封电子邮件都是HTML电子邮件,并且有一个取消订阅URL,因此如果用户单击链接,他就会被添加到我的取消订阅模式中,然后我就不会给他们发送电子邮件 我想以某种方式加密电子邮件地址,将其作为get参数传递,然后在视图中解密并将其存储在我的数据库中。 我不知道在Dja

我正在努力在我的电子邮件上实现“取消订阅链接”。我正在为未订阅的用户维护一个表

我想知道的电子邮件地址,一旦用户点击取消订阅链接。当然,我不能将其作为get参数发送,因为可以很容易地修改它

一个例子是,我想给我的10个朋友发送电子邮件,每封电子邮件都是HTML电子邮件,并且有一个取消订阅URL,因此如果用户单击链接,他就会被添加到我的
取消订阅模式中,然后我就不会给他们发送电子邮件

我想以某种方式加密电子邮件地址,将其作为get参数传递,然后在视图中解密并将其存储在我的数据库中。 我不知道在Django该怎么做。
如果有更好的方法来实现这一点,请告诉我。

通常,加密也不是一个好主意,因为如果知道解密密钥,人们可以解密所有可能的内容,此外,它还可以使使用加密密钥开始攻击此应用程序变得相当容易:如果我以某种方式找到加密密钥,我可以构造一个URL,例如重置任意电子邮件地址的密码,从而重置Bob的密码,然后以Bob的身份登录

一个典型的解决方案是构造一个“取消订阅会话”表。如果有人请求取消订阅,您将该人添加到表中,并向其中添加某种随机的
id
。最好不要使用主键之类的东西,因为它可以预测上一个和下一个
id
s将是什么,然后人们可以“黑客”这个系统来确认另一个人的退订

因此,我们创建一个表,例如GUID(全局唯一标识符):

因此,现在如果您想取消订阅某人,您可以构造这样的
UnsubscribingUser
model实例,并发送一封带有链接的电子邮件:

def unsubscribe(request):
    uu = UnsubscribingUser.objects.create(user=request.user)

    # send mail with uu.uuid
    # ...
    pass
然后,电子邮件应包含链接到处理UUID的视图的URL:

from datetime import datetime
from django.http import Http404

def unsubscribe_url(request, uuid):
    uu = get_object_or_404(UnsubScribingUser, uuid=uuid)
    if uu.expires <= datetime.now():
        # unsubscribe logic
        # ...
        uu.delete()
    else:
        # too late
        # do something in that case, for example
        uu.delete()
        raise Http404
从日期时间导入日期时间
从django.http导入Http404
def取消订阅url(请求,uuid):
uu=获取对象或404(取消订阅者,uuid=uuid)

如果uu.expires过期,为什么要加密它?不仅仅是散列?那么我应该如何在Django中进行散列和去散列?散列函数的思想是,在合理的时间内不可能对其进行去散列。密码通常也与hashfunction一起存储……此外,我真的不知道“未订阅用户”表是否符合GDPR。如果我回忆正确,欧盟用户的数据应该被销毁,如果不再需要的话。非常感谢,这个解决方案很好,但我不确定它在我的情况下如何工作。我正在编辑我的问题,以更好地解释我的需求-假设我有几个朋友的电子邮件,我向他们发送HTML电子邮件,每个电子邮件都有一个取消订阅URL,因此每个电子邮件的取消订阅URL将与其他朋友得到的不同,并且URL将有电子邮件(不知何故),在您的解决方案中,我将其存储在db中,我必须为每个用户创建一个
UnsubscribingUser
实例,如果我向大量用户发送电子邮件,并且只有少数用户取消订阅,这可能不好。我的用例很简单,我只需要在我的URL中加密我的电子邮件以便取消订阅。
from datetime import datetime
from django.http import Http404

def unsubscribe_url(request, uuid):
    uu = get_object_or_404(UnsubScribingUser, uuid=uuid)
    if uu.expires <= datetime.now():
        # unsubscribe logic
        # ...
        uu.delete()
    else:
        # too late
        # do something in that case, for example
        uu.delete()
        raise Http404