1

我正在用 Django 从头开始​​编写帐户激活过程,这是我的基本思考过程:

创建一个模型,如:

class UserAccountActivation(models.Model):
    lock = models.CharField(max_length=16)
    key = models.CharField(max_length=16)

必要时使用如下函数生成锁和键值:

def generate_entry():
    """Generate a random alphanumeric string between 8 and 16 characters long."""
    ''.join(random.choice(string.ascii_lowercase + string.digits) for x in range(random.randint(8,16))

编写这样的链接:

r'^activate/(?P<lock>\w{8,16})/(?P<key>\w{8,16})/?$'

并将其发送出去。当他们点击链接时,我激活帐户并禁用激活密钥。

我最初考虑散列随机字符串作为额外的预防措施,但这似乎没有必要,而且在我的 URL 中有两个 32 长度的键会很长:

account/12345678/12345678
    or
account/12345678901234567890123456789012/12345678901234567890123456789012

这是处理帐户激活的安全且推荐的方式吗?是否有必要在字符串上设置随机长度?

4

2 回答 2

1

好吧,要回答这个问题,您必须考虑为什么您的帐户激活受到保护。可能是为了防止人们猜测激活码,这样他们就可以使用虚假的电子邮件地址。由于电子邮件地址无论如何都很容易获得,因此激活过程并不需要比在网络上某处注册电子邮件帐户要困难得多。任何更多的努力都是徒劳的,因为攻击者只会将攻击转移到另一个弱点。

使用随机字符串对此非常好。

如果您需要更高的安全性,您可以考虑在其中放置一个散列帐户 ID,这样您就可以计算然后停止多次尝试猜测激活码的失败尝试。

于 2011-10-10T05:16:15.800 回答
1

具有可变长度是一件好事,以免它容易受到定时攻击

此外,python 的内置随机数并不是真正的密码安全,因此最好使用hashlib 中的 sha或通过 linux 生成的系统随机数,您可以通过 sys 调用获得。

于 2011-10-10T07:35:19.887 回答