【问题标题】:Creating a password with an extra booleanField使用额外的 booleanField 创建密码
【发布时间】:2011-10-08 07:38:16
【问题描述】:

我有以下问题。我为我的网站设置了注册密码,以便用户 需要知道这个密码才能注册。我还想要一个链接到它的布尔值,它可以确定用户使用此密码获得什么样的权限。

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

    def __unicode__(self):
        return self.password

我向 admin 注册了这个,这样我就可以添加和删除密码,并使超级用户链接到它们是 true 或 false。然后当用户注册时,我会像这样检查布尔值:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 是的,但是我如何使用两个不同的注册密码。其中一个使 user.is_super= TRUE,另一个使 user_is_superuser= FALSE。问题不在于权限分配,而在于我可以使用两个不同的密码将它们分配到特定组中的方式。
    【解决方案2】:

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

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

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

    如果您正在创建一个网络应用程序,则可以在提交网页之前在 javascript 中进行哈希处理,这样哈希后的密码会通过网络传播,从而使黑客难以拦截然后“取消哈希”它们

    Javascript 散列如下(假设我们使用 md5 并且用户密码是“test”)

    1. 生成“test”的 md 5 即 098f6bcd4621d373cade4e832627b4f6 并将其存储在数据库中
    2. 在客户端(javascript)检索会话 ID
    3. 假设用户首先输入“test”md5,所以结果是 098f6bcd4621d373cade4e832627b4f6
    4. md5 再次添加会话 ID(假设会话 ID 为 9985),因此新的 md5 为 f93437292fca0cf9b71bf1f3fe6c4679
    5. 将哈希发送到服务器
    6. 服务器可以使用其中一种库方法获取会话ID,例如在Java中可以通过session.getId()获取ID;
    7. 运行类似于以下的查询

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

    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)

    【讨论】:

    • javascript 中的散列非常“安全”。
    • 你是对的,我们可能会暴露我们使用什么算法进行哈希。但我在某些地方看到该网站使用 javascript 散列,并将会话 ID 附加为盐。因为 salt 本身就是 session-id,所以甚至无法对此类网站进行重放攻击。
    • 因此,如果“黑客”嗅探流量,他将知道哈希、盐和算法。非常非常棒。我也听说过this thing,但是 JS 解决方案对我来说似乎更可靠,是的。
    • 如果您停止讽刺并开始了解解决方案,它将有所帮助。告诉我即使你知道盐和算法,你将如何在给定的场景中破解密码。两次会议之间的盐永远不会相同。如果您使用截获的盐并将其发送到服务器,它将永远不会匹配,因为您的盐与服务器上使用的盐不同。
    • 我相信如果有人提出建议,他应该真正了解该主题。因为糟糕的建议比没有建议更糟糕。您建议使用 JS 散列来“让黑客难以拦截然后“取消散列””。假设,我是黑客。我截获了一些流量:session_id(你需要以某种方式传输它),hash。我可以去网页看看算法。所以我可以开始暴力破解,如果密码不是很复杂(像大多数密码一样),我会在合理的时间内破解它。此解决方案非常易受攻击,与 HTTPS 相比没有优势。那么,为什么要推荐它呢?
    【解决方案3】:

    我还想要一个与之关联的布尔值,它可以确定用户使用此密码获得何种权限

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

    如果这个“超级用户”不是超级用户,那么你需要定义一个拥有额外权限的组,并将超级用户放在这个组中。

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

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

    【讨论】:

    猜你喜欢
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 2017-12-29
    • 1970-01-01
    • 2021-12-14
    • 2012-10-30
    • 1970-01-01
    相关资源
    最近更新 更多