使用额外的booleanField创建密码

时间:2011-07-19 08:13:57

标签: python django django-models django-forms django-views

我有以下问题。我为我的网站制作了一个注册密码,以便用户 需要知道这个密码才能注册。此外,我想要一个链接到它的布尔值,它将决定用户使用此密码获得的权限类型。

class RegistrationPassword(models.Model):
    password = models.CharField(max_length=20, unique=True)
    poweruser = models.BooleanField(default=False)

    def __unicode__(self):
        return self.password

我向admin注册了这个,这样我就可以添加和删除密码,并使poweruser链接到它们是真还是假。然后,当用户注册时,我检查布尔值,如下所示:

registrationpassword = form.cleaned_data.get('registrationpassword')
ispoweruser = RegistrationPassword.objects.get(password=registrationpassword).poweruser

问题是密码没有以任何方式进行散列或加密。如何为我的方法添加更多安全性?

3 个答案:

答案 0 :(得分:1)

  

此外,我想要一个与之关联的布尔值,这将决定用户使用此密码获得的权利类型

别。使用组。这就是他们的目的。

如果此“超级用户”不是超级用户,那么您需要定义一个具有额外权限的组,并将高级用户置于该组中。

每个视图功能都需要确认用户是否在适当的组中才能使用视图功能。

现在ispoweruser是一个针对组名的简单测试,没有额外的密码没有额外的布尔值。

答案 1 :(得分:0)

使用auth应用和user.is_superuser。不要重新发明轮子。

答案 2 :(得分:0)

  

问题是密码没有以任何方式进行散列或加密。如何为我的方法添加更多安全性?

最常用的密码是使用SHA-x或MD-5散列算法进行散列。在这种情况下,开发人员散列密码并将散列副本存储在数据库或代码中。因此,任何地方都没有人类可读的副本。

要对此密码进行身份验证,您必须创建用户输入密码的HASH,然后将其与存储的密码进行比较。

如果您正在创建一个Web应用程序,则可以在提交网页之前使用javascript完成哈希,这样一个哈希密码会通过网络传播,这使得黑客很难拦截然后“取消哈希”它们

Javascript哈希如下(假设我们使用的是md5,用户密码是“test”)

  1. 生成“test”的md 5,即098f6bcd4621d373cade4e832627b4f6,并将其存储在db
  2. 在客户端(javascript)检索session-id
  3. 让我们说用户首先输入“test”md5,结果是098f6bcd4621d373cade4e832627b4f6
  4. md5再次使用session-id前置(假设这里的会话ID是9985)所以新的md5是 f93437292fca0cf9b71bf1f3fe6c4679
  5. 哈希发送到服务器
  6. 服务器可以使用其中一个库方法获取会话ID,例如在Java中,可以通过session.getId()获取id;
  7. 运行类似于以下

    的查询

    选择md5(concat(pwd,'9985'))作为newpwd来自uname ='xyz'的用户

  8. 将“newpwd”与用户提交的值匹配
  9. 如果有人试图通过HTTP回复发布数据,则认证将不会通过,因为服务器每次都会创建新的会话ID。 因此,如果用户注销并重新登录,则通过网络发送新的哈希密码。

    请参阅以下链接以供参考

    Python's safest method to store and retrieve passwords from a database

    What is the format in which Django passwords are stored in the database?

    http://en.wikipedia.org/wiki/Salt_(cryptography)