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

时间:2014-04-30 18:39:29

标签: python django

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

unique=True在球场上。

答案 1 :(得分:0)

你可能想要itsdangerous的内容,或者只是标准的hmac

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

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

在响应其中一个请求时,将消息分解为查找值和签名,并验证签名是否针对该特定值。

一个缺点是主键(或其他键)在消息中以明文编码;它可能会披露有关该对象的更多信息,而不是您想要的。也就是说,在没有签名密钥的情况下,没有(合理的)可能“签名”任何特定密钥的签名。