为模型快速生成唯一的静态令牌



我有几个模型,我想为它们生成唯一的令牌,这样我就可以使用"秘密"URL访问它们。现在,我通过在每个模型上创建一个"令牌"字段,并使用uuid填充模型的save方法来实现这一点,如下所示:

        self.token = uuid.uuid4().hex
        while Notification.objects.filter(token=self.token).exists():
            self.token = uuid.uuid4().hex

虽然这是可行的,但明显的缺点是:(1(我需要为每个Notification条目都有一个token字段,更重要的是,(2(每次创建新模型时,这至少会查询数据库一次。虽然uuid4((不太可能产生重复的令牌,但任何严肃的应用程序仍然需要进行检查。

有没有更好的方法可以生成一个随机的唯一令牌,可能是从模型的id派生的,可以保证我是唯一的,但攻击者仍然无法预测/猜测,而不必进行查询以确保它是唯一的?

添加一个约束以确保令牌字段只接受唯一值。然后在save方法中捕获异常并重新生成令牌(如果是(。

unique=True在场上。

您可能想要一些类似其危险的东西,或者只是标准的hmac库

这个想法是,你可以在你的服务器上建立一个私人密钥;你只需要做一次。

然后,使用该密钥和适当的哈希算法来生成所谓的"消息身份验证码",这是一种安全的方法,可以证明消息确实来自原始来源,在您的情况下,来自服务器。该消息将包含要访问的数据的主键或其他有用的查询值。

当响应其中一个的请求时,您将消息分解为查找值和签名,并验证签名是否适用于该特定值。

一个缺点是主键(或其他键(在消息中以明文编码;这可能会披露比你想要的更多的关于物体的信息。也就是说,在没有签名密钥的情况下,签名不可能被"猜测"为任何特定密钥。

最新更新