Django 身份验证和密码学 - 它是如何工作的?

Django authentication and cryptography - How does it works?

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

在我看来,我认为身份验证有点像 python 条件: 如果输入==密码: 认证=真 (显然我知道它不是那样编码的)

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

密码不是 "unhashed",而是再次以相同的方式对密码进行哈希处理并比较哈希值。

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

Django 使用多种加密安全散列算法中的任何一种来执行此操作。加密哈希算法被编写为获取任意长度的数据和 return 一个数字("message digest"), 似乎 完全随机,但具有几个特殊属性:

  • 输入相同的数据总是return相同的数字
  • 即使输入稍有不同的数据也会产生完全不同的数字
  • 从输出数据计算输入数据几乎是不可能的

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

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)。

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

您为此安全性付出的代价是每次用户登录 "re-encrypt" 他们的密码时必须 运行 散列算法并检查它是否与数据库中的内容相匹配(这可能需要每次登录尝试几毫秒)。

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