2011-07-19 40 views
0

我有以下问题的密码。我为我的网站做了一个注册密码,这样 需要知道这个密码,用户可以注册。另外我想要一个链接到它的布尔值,这将决定用户使用此密码获得什么样的权限。创建一个额外的booleanField

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

    def __unicode__(self): 
     return self.password 

我注册这个具有管理员这样我就可以添加和删除密码,并链接到这些高级用户无论是真的还是假的。然后当用户注册时,我检查这样的布尔值:

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

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

回答

0

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

+0

是的,但我怎么能说两个不同的注册密码。其中一个使user.is_super = TRUE,另一个user_is_superuser = FALSE。问题不在于权限分配,而在于我可以使用两个不同的密码将它们分配到特定的组中。 – leffe

0

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

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

要反对这个密码,您必须创建用户输入密码的哈希身份验证,然后进行比较与存储的密码。

如果要创建一个Web应用程序中的散列可以通过javascript提交网页之前完成,这样一个哈希密码通过网络传输,使其难以被黑客截获,然后选择“取消哈希”他们

的Javascript哈希云像以下(假设我们使用MD5和用户密码为“测试”)

  1. 产生的“测试”,这是098f6bcd4621d373cade4e832627b4f6 MD 5,并将其存储在数据库
  2. 在客户端(javascript)检索会话ID
  3. 比方说,用户进入“测试” MD5它首先所以结果是098f6bcd4621d373cade4e832627b4f6
  4. MD5再次与前置会话ID(假设这里的会话ID是9985),因此新的MD5是 f93437292fca0cf9b71bf1f3fe6c4679
  5. 发送ONLY哈希服务器
  6. 服务器可以在Java中使用一个的库的方法之一,例如可以得到由session.getId的ID()获取会话ID;
  7. 运行查询,其类似于以下

    选择的MD5(CONCAT(PWD, '9985')),如从用户NEWPWD其中UNAME = 'XYZ'

  8. 匹配 “NEWPWD” 与用户提交的值

如果有人试图通过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)

+0

在JavaScript中散列非常“安全”。 – DrTyrsa

+0

你说得对,我们可能会公开我们使用什么算法来进行散列。但是我曾经在一些地方看到过这个网站使用javascript哈希算法,会话ID附加为salt。因为salt本身就是session-id,所以甚至不能在这些网站上进行重播攻击。 – Sap

+0

因此,如果一个“黑客”嗅探交通,他会知道哈希,盐和algorythm。非常非常棒。我也听说过[这个东西](http://en.wikipedia.org/wiki/HTTP_Secure),但JS解决方案似乎对我更可靠,是的。 – DrTyrsa

1

此外,我想链接到它的一个布尔值,这将决定什么样的权利用户获得此密码

不要。使用组。这就是他们的目的。

如果此“超级用户”不是超级用户,那么您需要定义一个具有其额外特权并将超级用户放入此组的用户组。

您的每个视图函数都需要确认用户在合适的组中才能使用视图函数。

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

+0

值得一读:Django docs on [groups](https: //docs.djangoproject.com/en/dev/topics/auth/#groups)和[自定义权限](https://docs.djangoproject.com/en/dev/topics/auth/#custom-permissions)。 –