【问题标题】:Django authentication and cryptography - How does it works?Django 身份验证和加密 - 它是如何工作的?
【发布时间】:2025-11-29 08:10:01
【问题描述】:

我是 django 的新手,我想知道身份验证系统和散列密码在 django 中是如何工作的?为什么无法知道用户密码? (即使我知道算法和盐)

在我看来,我看到了一些类似于 python 条件的身份验证: 如果输入==密码: 认证=真 (显然我知道它不是这样编码的)

但我不知道它是如何散列和取消散列的,以及是否有办法知道用户密码是什么?

【问题讨论】:

    标签: django django-authentication


    【解决方案1】:

    不可能知道用户的密码,因为它们是加密的。

    Django 使用多种加密安全哈希算法中的任何一种来执行此操作。编写加密哈希算法以获取任意长度的数据并返回一个似乎完全随机的数字(“消息摘要”),但具有几个特殊属性:

    • 输入相同的数据将始终返回相同的数字
    • 即使输入略有不同的数据也会产生完全不同的数字
    • 从输出数据计算输入数据几乎是不可能的

    您究竟如何编写加密哈希算法来做到这一点很复杂,但如果您有兴趣,值得一读。

    Django 所做的基本上是这样的:

    def is_password_correct(hash, salt, rounds, password):
        """<hash>, <salt>, and <rounds> come from the DB
        <password> comes from the user
        """
        digest = hash_function(salt + password)
    
        # make guessing a password take lots more work
        for n in range(rounds):
            digest = hash_function(digest)
    
        if digest == hash:
            return True
        else:
            return False
    

    其中hash_function() 是 Django 支持的加密哈希函数之一(例如 BCrypt 或 PBKDF2)。

    这比将用户密码以纯文本形式存储在数据库中要安全得多,因为如果黑客要获取数据库的副本,他们将得到的只是密码哈希值。从密码哈希中恢复密码需要猜测实际密码并通过运行上述函数进行检查。这可以保护您的用户(违反所有安全建议)在多个地方使用相同的密码。

    您为这种安全性付出的代价是每次用户登录时都必须运行哈希算法以“重新加密”他们的密码并检查它是否与数据库中的内容匹配(每次登录尝试可能需要几毫秒) .

    你可以阅读更多关于他们的密码系统here

    【讨论】:

    • 非常感谢!我见过的最好的解释:)
    【解决方案2】:

    密码不是“未散列的”,而是再次以相同的方式对密码进行散列并比较散列。

    【讨论】: